벡터::erase(): 객체를 삭제하지 않고 포인터 삭제
문제:
개체 포인터의 벡터에서는 개체 자체를 유지하면서 요소를 제거해야 합니다. 그러나 제거 시 객체가 파괴될 수 있다는 우려가 있습니다.
답변:
vector::erase()는 벡터에서 요소를 효과적으로 제거하고 소멸자를 호출합니다. . 그러나 포인터를 다룰 때 소멸자는 실제 객체의 소멸에 개입하지 않습니다. 이는 컨테이너가 가리키는 개체의 소유권을 갖지 않기 때문입니다.
해결 방법:
지정된 개체를 삭제하려면 명시적으로 다음을 사용하는 것이 중요합니다. 각 포인터의 삭제 연산자. 다음은 예시 코드 조각입니다.
<code class="cpp">void clearVectorContents( std::vector <YourClass*> & 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!