>백엔드 개발 >C++ >포인터가 가리키는 개체를 파괴하지 않고 벡터의 포인터를 어떻게 안전하게 삭제합니까?

포인터가 가리키는 개체를 파괴하지 않고 벡터의 포인터를 어떻게 안전하게 삭제합니까?

Patricia Arquette
Patricia Arquette원래의
2024-10-31 03:51:31411검색

 How Do You Safely Delete Pointers in a Vector Without Destroying the Objects They Point To?

벡터::erase(): 객체를 삭제하지 않고 포인터 삭제

문제:

개체 포인터의 벡터에서는 개체 자체를 유지하면서 요소를 제거해야 합니다. 그러나 제거 시 객체가 파괴될 수 있다는 우려가 있습니다.

답변:

vector::erase()는 벡터에서 요소를 효과적으로 제거하고 소멸자를 호출합니다. . 그러나 포인터를 다룰 때 소멸자는 실제 객체의 소멸에 개입하지 않습니다. 이는 컨테이너가 가리키는 개체의 소유권을 갖지 않기 때문입니다.

해결 방법:

지정된 개체를 삭제하려면 명시적으로 다음을 사용하는 것이 중요합니다. 각 포인터의 삭제 연산자. 다음은 예시 코드 조각입니다.

<code class="cpp">void clearVectorContents( std::vector <YourClass*> &amp; a ) 
{    
    for ( int i = 0; i < a.size(); i++ ) 
    {       
        delete a[i];    
    }    
    a.clear(); 
} 

주의:

표준 컨테이너에 원시 포인터를 저장하는 것은 권장되지 않습니다. 대신 포인터로 리소스 할당을 효과적으로 관리하려면 Boost::shared_ptr을 활용하는 것이 좋습니다.

우아한 솔루션:

더 다양하고 효율적인 접근 방식을 위해 펑터를 구현하여 삭제하세요. 벡터의 포인터입니다. 다음은 예시입니다.

<code class="cpp">// Functor for deleting pointers in vector.
template<class T> class DeleteVector
{
    public:
    // Overloaded () operator.
    // This will be called by for_each() function.
    bool operator()(T x) const
    {
        // Delete pointer.
        delete x;
        return true;
    }
};</code>

for_each로 이 펑터를 호출하면 신속하고 간결한 솔루션이 제공됩니다.

<code class="cpp">for_each( myclassVector.begin(),myclassVector.end(),
          DeleteVector<myclass*>());</code>

여기서 myclassVector는 myclass 객체에 대한 포인터를 보유하는 벡터를 나타냅니다.

이 전략을 사용하면 벡터의 무결성을 유지하면서 가리키는 모든 개체를 안전하게 제거할 수 있습니다.

위 내용은 포인터가 가리키는 개체를 파괴하지 않고 벡터의 포인터를 어떻게 안전하게 삭제합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.