Похоже, вы создаете здесь структуру данных, в которой дети имеют указатели на своих родителей. Использование временных средств в этом случае гарантирует вам горе. Для того чтобы сделать это безопасным, вам нужно будет динамически распределять и, возможно, использовать какой-то счетчик ссылок.
Рассматривали ли вы использование boost::shared_ptr
? Это реализация класса интеллектуальных указателей с подсчетом ссылок. Используя shared_ptr
и, возможно, некоторые фабричные методы, вы сможете получить желаемый эффект и уменьшить трудность динамического выделения памяти. Я попробовал это, и это похоже на работу. Как только код выходит из области видимости, все объекты уничтожаются, потому что не осталось ссылок на shared_ptrs.
Edit:
В ответ на комментарий zounds ' я изменил пример так, чтобы корневой объект управлял временем жизни структуры данных.
#include <iostream>
#include <string>
#include <vector>
#include <boost\shared_ptr.hpp>
#include <boost\weak_ptr.hpp>
using boost::shared_ptr;
using boost::weak_ptr;
using std::string;
using std::cout;
using std::endl;
using std::vector;
class person;
typedef shared_ptr<person> Person;
typedef weak_ptr<person> PersonWk;
class person {
PersonWk pThis;
friend Person makePerson(const string & nam, Person m = Person());
string name;
PersonWk mommy; // children should not affect parent lifetime, so store weak ptr
vector<Person> children; // parents affect children lifetime so store child shared ptrs
// make constructor private so that you can only make a person using factory method
person(const string & nam, Person m) : name(nam), mommy(m)
{
// for demo purposes
printf("creating %s\n", nam.c_str());
++personCount;
}
// undefined copy constructor and assignment operators
person(const person&);
person& operator=(const person&);
public:
// for demo purposes
static int personCount;
~person()
{
// for demo purposes
printf("destroying %s\n", name.c_str());
--personCount;
}
Person baby(const string & nam){
Person child = makePerson(nam, Person(pThis));
children.push_back(child);
return child;
}
void talk() const{
if (Person mom = mommy.lock())
mom->talk();
cout << name << endl;
}
};
int person::personCount = 0;
// factory method to make a person
Person makePerson(const string & name, Person m) {
Person p = Person(new person(name, m));
p->pThis = p; // stash weak_ptr so I can use it to make a shared_ptr from "this" in the baby method
return p;
}
void use(const Person p) {
printf("In method use...\n");
p->talk();
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("personCount=%d\n", person::personCount);
{
Person ann = makePerson("Ann");
// ann has baby and grandbaby, pass grandbaby to use method
use(ann->baby("Susan")->baby("Wendy"));
ann.reset(); // remove reference from root object. Destruction ensues...
}
printf("personCount=%d\n", person::personCount);
return 0;
}