해결하려고하는 재귀 문제가 있습니다. 주어진 행동이 가능하다면, 추가적인 아동 행동 등이있을 수 있습니다.소멸자를 사용하여 구성원 벡터에서 힙 할당 객체 삭제
// 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++에 익숙하지 않고 직접적인 질문이 내게 가장 도움이 될 것이라고 생각했다.
['std :: unique_ptr'] (http://en.cppreference.com/w/cpp/memory/unique_ptr) 또는 ['std :: shared_ptr']와 같은 스마트 포인터를 사용해야합니다 (http : /en.cppreference.com/w/cpp/memory/shared_ptr) 원시 포인터 대신 객체 소유권을 처리합니다. 부작용으로 귀하의 질문은 논박의 여지가 있습니다. –
클래스가 자녀를 소유하고 있는지 여부를 결정해야합니다. 그럴 경우 위의 코드를 수행해야합니다. – Spads
스마트 포인터가 언제나 그 날을 저장하지는 않을 것이라고 지적하고 싶습니다. 그들은 그들 자신의 문제를 제기합니다. 프로젝트 전체에서 사용하기로 결정하기 전에 http://stackoverflow.com/questions/1905787/pros-and-cons-of-smart-pointers를 확인하십시오. – Spads