포인터 벡터에서 객체를 지우면 객체 자체가 삭제되나요?
객체에 대한 포인터 벡터를 처리할 때 erasure() 함수 사용의 의미. erasure()는 벡터에서 요소를 제거하고 해당 소멸자를 호출하지만 참조된 객체를 자동으로 삭제하지는 않습니다.
벡터의 객체 포인터에 대한 의미
객체 포인터의 컨텍스트에서 erasure()는 단순히 포인터를 벡터에서 분리할 뿐 기본 객체를 파괴하는 소유권을 가져오지는 않습니다. 적절한 리소스 관리를 보장하려면 각 포인터에 대해 명시적으로 삭제를 호출하여 참조된 개체를 삭제해야 합니다.
포인터를 안전하게 지우기 위한 권장 접근 방식
포인터와 포인터를 안전하게 지우려면 벡터의 연관된 객체에 대해 다음 접근 방식을 사용할 수 있습니다.
<code class="cpp">void clearVectorContents(std::vector<YourClass*> &a) { for (int i = 0; i < a.size(); i++) { delete a[i]; // Delete the object pointed to by each pointer } a.clear(); // Remove pointers from the vector }
공유 포인터를 사용한 대체 접근 방식
더 우아하고 일반적인 솔루션을 위해 부스트 사용을 고려하세요. ::shared_ptr. 공유 포인터는 리소스 소유권과 삭제를 자동으로 관리하므로 포인터 벡터를 보다 안전하고 쉽게 처리할 수 있습니다.
템플릿과 펑터를 사용하는 향상된 솔루션
이 향상된 솔루션은 템플릿과 포인터 삭제 프로세스를 단순화하는 functor:
<code class="cpp">template<class T> class DeleteVector { public: // Delete pointer bool operator()(T x) const { delete x; return true; } };</code>
사용법:
<code class="cpp">for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>());</code>
예제 코드
다음 예는 향상된 솔루션:
<code class="cpp">#include <functional> #include <vector> #include <algorithm> #include <iostream> // Your class class myclass { public: int i; myclass(): i(10) {} }; int main() { // Vector of pointers to myclass objects std::vector<myclass*> myclassVector; // Add objects to vector for (int i = 0; i < 10; ++i) myclassVector.push_back(new myclass); // Print initial vector contents for (auto& obj : myclassVector) std::cout << " " << obj->i; // Delete vector contents using enhanced solution for_each(myclassVector.begin(), myclassVector.end(), DeleteVector<myclass*>()); // Clear vector myclassVector.clear(); // Print vector size after deletion std::cout << "\n" << myclassVector.size(); return 0; }</code>
이러한 접근 방식을 활용하면 적절한 리소스 관리 및 개체 삭제를 보장하면서 개체 포인터가 포함된 벡터에서 요소를 안전하게 제거할 수 있습니다.
위 내용은 C의 벡터에서 포인터를 지우면 참조된 개체가 삭제됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!