2017-05-04 1 views
1

해결하려고하는 재귀 문제가 있습니다. 주어진 행동이 가능하다면, 추가적인 아동 행동 등이있을 수 있습니다.소멸자를 사용하여 구성원 벡터에서 힙 할당 객체 삭제

// MyObj.h 
#include <vector> 
class MyObj 
{ 
    private: 
     std::vector<MyObj*> _children; 
    public: 
     void addChild(MyObj* m); 
} 

// MyObj.cpp 
#include "MyObj.h" 
void MyObj::addChild(MyObj* m) 
{ 
    MyObj::_children.push_back(m); 
} 

이 같은 클래스를 사용하고 있습니다 : 내 솔루션은이 같은 클래스가

MyObj m; 
MyObj *child = new MyObj(); 
m.addChild(child); 

나의 이해는 내가 힙에 child를 할당하기 때문에, 나중에 그것을 파괴 할 필요가 있다는 것입니다. 그 객체를 생성하는 코드가 그 참조를 유지하지 않으면, 그 객체를 파기하기 위해 부모 객체가 될 것입니다. 그것은 이런 소멸자 정의에 적합한이 함께 궤도에

MyObj::~MyObj() 
{ 
    for (std::size_t i = 0; i < MyObj::_children.size(); i++) 
    { 
     delete MyObj::_children[i]; 
    } 
} 

암 I을, 또는 나의 접근 방식은 결함이?

추신 : 내가 직접 소멸자와 관련된 많은 질문이 있다는 것을 알고 있으므로 직접적인 복제본 인 경우 사과드립니다. 나는 무리를 읽었지만 여전히 자신감을 갖지 못했다. 나는 C++에 익숙하지 않고 직접적인 질문이 내게 가장 도움이 될 것이라고 생각했다.

+2

['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr) 또는 ['std :: shared_ptr']와 같은 스마트 포인터를 사용해야합니다 (http : /en.cppreference.com/w/cpp/memory/shared_ptr) 원시 포인터 대신 객체 소유권을 처리합니다. 부작용으로 귀하의 질문은 논박의 여지가 있습니다. –

+1

클래스가 자녀를 소유하고 있는지 여부를 결정해야합니다. 그럴 경우 위의 코드를 수행해야합니다. – Spads

+1

스마트 포인터가 언제나 그 날을 저장하지는 않을 것이라고 지적하고 싶습니다. 그들은 그들 자신의 문제를 제기합니다. 프로젝트 전체에서 사용하기로 결정하기 전에 http://stackoverflow.com/questions/1905787/pros-and-cons-of-smart-pointers를 확인하십시오. – Spads

답변

1

꼭 필요한 경우가 아니면 new을 사용하지 마십시오. 일단 그렇게하면 동적으로 할당 한 메모리를 할당 해제하는 것은 사용자의 책임입니다. 위의 코드에서 : 함수가 범위를 벗어나되면

MyObj m; 
MyObj *child = new MyObj(); 
m.addChild(child); 

, mchild는 소멸자 기능 따라서 둘 다 파괴, 그들은 동적으로 할당되지 않기 때문에 부름을해야합니다.

그러나, 내용이 child 포인터가 있습니다에 지적 하지 m과 동적 new을 통해 무료 저장소에 할당 된 이후 child와 유사한 방식으로 파괴. 이 경우 위에 설명한 것처럼 무료 스토어에 올린 모든 오브젝트에 대해 delete으로 전화해야합니다.

사람들이 스마트 포인터를 사용한다고 제안하는 이유는 사람들이 RAII 패러다임을 따르므로 스마트 포인터를 사용하면 범위에서 벗어나면 자동으로 할당이 해제됩니다.