> 백엔드 개발 > C++ > 본문

C의 벡터에서 포인터를 지우면 참조된 개체가 삭제됩니까?

Susan Sarandon
풀어 주다: 2024-10-30 19:58:03
원래의
474명이 탐색했습니다.

  Does Erasing Pointers from a Vector in C   Destroy the Referenced Objects?

포인터 벡터에서 객체를 지우면 객체 자체가 삭제되나요?

객체에 대한 포인터 벡터를 처리할 때 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿