벡터에 저장된 객체에 속하는 포인터를 삭제하는 방법은 무엇입니까?

Sho

Containing 클래스, Contained 클래스 및 Data 클래스가 있습니다. Containing 클래스에는 Contained 객체의 벡터가 있습니다. Contained 클래스는 Contained 생성자의 힙에 할당 된 데이터 개체에 대한 포인터를 보유합니다. 그러나 소멸자에서 할당을 해제 할 수는 없습니다. 벡터가 Contained의 복사본을 만든 다음 파괴하여 사용중인 복사본에서도 데이터 포인터를 파괴하기 때문입니다.

TL; DR 설명 할 코드는 다음과 같습니다.

class Data {
    public:
        Data();
};

class Contained {
    private:
        Data* data;
    public:
        Contained();
        // what should I add ? a copy constructor ? an assignement operator ? and how
};

class Container {
    private:
        vector<Contained> rooms;
    public:
        //some member functions
};
Contained::Contained() {
    data = new Data();
}

데이터는 어디에서 삭제합니까?

Waqar

RAII (Resource Acquisition is Initialization) 사용

Contained클래스에 소멸자를 추가합니다 .

Contained::~Contained() {
    delete data;
}

이렇게하면 포함 된 개체가 범위를 벗어날 때마다 해당 data포인터 가 자동으로 삭제됩니다 . 그래서 만약 당신이

//delete first element
rooms.erase(rooms.begin());

data 해당 개체의 ptr이 자동으로 삭제됩니다.

스마트 포인터 사용

사용 std::unique_ptr<T>.

class Contained {
    private:
        std::unique_ptr<Data> data;
    public:
        Contained();
        // what should I add ? a copy constructor ? an assignement operator ? and how
};

그리고 생성자에서 :

Contained::Contained() {
    data = std::make_unique<Data>();
}

스마트 포인터 (예 : ( unique_ptr, shared_ptr))를 사용하면 아무도 포인터를 소유하지 않을 때 포인터가 자동으로 삭제됩니다. 복사는 할 수없고 unique_ptr이동 만 가능하므로 Contained클래스 에 이동 생성자와 이동 할당 연산자를 정의해야합니다 .

Contained::Contained(Contained&& other) 
    : data(std::move(other.data))
{}

Contained& operator=(Contained&& rhs) {
    if (this != &other) {
        data = std::move(rhs.data);
    }
    return *this;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

벡터에 클래스 포인터를 저장하는 방법은 무엇입니까?

분류에서Dev

벡터 요소의 세부 정보를 포인터에 저장하는 방법은 무엇입니까?

분류에서Dev

벡터에 개체를 저장하는 방법은 무엇입니까?

분류에서Dev

세트에 삽입 된 다음 벡터로 푸시되는 객체에 대한 포인터를 유지하는 방법은 무엇입니까?

분류에서Dev

클래스의 객체에 대한 포인터 벡터를 선언하는 방법은 무엇입니까?

분류에서Dev

원시 포인터를 사용하여 벡터의 객체 속성에 객체를 할당하는 방법은 무엇입니까?

분류에서Dev

'std :: function'에 대한 포인터에 저장된 람다를 호출하는 방법은 무엇입니까?

분류에서Dev

R에서 벡터로 함수의 인쇄 된 출력을 저장하는 방법은 무엇입니까?

분류에서Dev

변수 포인터에 저장되지 않은 힙에서 개체를 삭제하는 방법은 무엇입니까?

분류에서Dev

C ++에서 객체 포인터의 const 벡터에 값을 할당하는 방법은 무엇입니까?

분류에서Dev

벡터에 출력을 저장하는 방법은 무엇입니까?

분류에서Dev

복제 된 git 저장소에서 태그를 삭제하는 방법은 무엇입니까?

분류에서Dev

GridView의 Tag 속성에 저장된 개체 데이터에 액세스하는 방법은 무엇입니까?

분류에서Dev

따옴표없이 벡터에 저장된 변수 이름을 사용하는 방법은 무엇입니까?

분류에서Dev

MATLAB에서 객체의 속성에 포인터를 할당하는 방법은 무엇입니까?

분류에서Dev

삭제 된 값을 변수에 저장하는 방법은 무엇입니까?

분류에서Dev

javascript-배열에서 객체를 삭제하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

Unity에서 Samba Share에 대해 저장된 비밀번호를 삭제하는 방법은 무엇입니까?

분류에서Dev

가장 우아한 방식으로 C ++의 객체 벡터를 기반으로 포인터 벡터를 초기화하는 방법은 무엇입니까?

분류에서Dev

C ++에서 구조체에 대한 포인터 벡터를 사용하는 방법은 무엇입니까?

분류에서Dev

React Redux에 다층 객체를 저장하는 방법은 무엇입니까?

분류에서Dev

RavenDB에서 동적 속성이있는 C # 객체를 저장하는 방법은 무엇입니까?

분류에서Dev

다형성 벡터에 포함 된 요소를 해제하는 방법은 무엇입니까?

분류에서Dev

"new"연산자로 생성 된 객체를 Firestore에 저장하는 방법은 무엇입니까?

분류에서Dev

여러 jsp 페이지간에 저장된 객체를 공유하는 방법은 무엇입니까?

분류에서Dev

vector <ptr *>에서 객체를 삭제하는 방법은 무엇입니까?

분류에서Dev

Realm : RLMArray에서 객체를 삭제하는 방법은 무엇입니까?

분류에서Dev

C에서 void 포인터로 정수를 저장하는 가장 좋은 방법은 무엇입니까?

분류에서Dev

객체 벡터에서 요소를 지우는 방법은 무엇입니까?

Related 관련 기사

  1. 1

    벡터에 클래스 포인터를 저장하는 방법은 무엇입니까?

  2. 2

    벡터 요소의 세부 정보를 포인터에 저장하는 방법은 무엇입니까?

  3. 3

    벡터에 개체를 저장하는 방법은 무엇입니까?

  4. 4

    세트에 삽입 된 다음 벡터로 푸시되는 객체에 대한 포인터를 유지하는 방법은 무엇입니까?

  5. 5

    클래스의 객체에 대한 포인터 벡터를 선언하는 방법은 무엇입니까?

  6. 6

    원시 포인터를 사용하여 벡터의 객체 속성에 객체를 할당하는 방법은 무엇입니까?

  7. 7

    'std :: function'에 대한 포인터에 저장된 람다를 호출하는 방법은 무엇입니까?

  8. 8

    R에서 벡터로 함수의 인쇄 된 출력을 저장하는 방법은 무엇입니까?

  9. 9

    변수 포인터에 저장되지 않은 힙에서 개체를 삭제하는 방법은 무엇입니까?

  10. 10

    C ++에서 객체 포인터의 const 벡터에 값을 할당하는 방법은 무엇입니까?

  11. 11

    벡터에 출력을 저장하는 방법은 무엇입니까?

  12. 12

    복제 된 git 저장소에서 태그를 삭제하는 방법은 무엇입니까?

  13. 13

    GridView의 Tag 속성에 저장된 개체 데이터에 액세스하는 방법은 무엇입니까?

  14. 14

    따옴표없이 벡터에 저장된 변수 이름을 사용하는 방법은 무엇입니까?

  15. 15

    MATLAB에서 객체의 속성에 포인터를 할당하는 방법은 무엇입니까?

  16. 16

    삭제 된 값을 변수에 저장하는 방법은 무엇입니까?

  17. 17

    javascript-배열에서 객체를 삭제하는 가장 좋은 방법은 무엇입니까?

  18. 18

    Unity에서 Samba Share에 대해 저장된 비밀번호를 삭제하는 방법은 무엇입니까?

  19. 19

    가장 우아한 방식으로 C ++의 객체 벡터를 기반으로 포인터 벡터를 초기화하는 방법은 무엇입니까?

  20. 20

    C ++에서 구조체에 대한 포인터 벡터를 사용하는 방법은 무엇입니까?

  21. 21

    React Redux에 다층 객체를 저장하는 방법은 무엇입니까?

  22. 22

    RavenDB에서 동적 속성이있는 C # 객체를 저장하는 방법은 무엇입니까?

  23. 23

    다형성 벡터에 포함 된 요소를 해제하는 방법은 무엇입니까?

  24. 24

    "new"연산자로 생성 된 객체를 Firestore에 저장하는 방법은 무엇입니까?

  25. 25

    여러 jsp 페이지간에 저장된 객체를 공유하는 방법은 무엇입니까?

  26. 26

    vector <ptr *>에서 객체를 삭제하는 방법은 무엇입니까?

  27. 27

    Realm : RLMArray에서 객체를 삭제하는 방법은 무엇입니까?

  28. 28

    C에서 void 포인터로 정수를 저장하는 가장 좋은 방법은 무엇입니까?

  29. 29

    객체 벡터에서 요소를 지우는 방법은 무엇입니까?

뜨겁다태그

보관