У меня ситуация, когда неясно, когда следует отбрасывать указатель. Это связано с тем, что класс использует рекурсию с разными методами, вызываемыми на основе ввода. Ниже я воспроизвел очень грубый пример этой ситуации. В моем коде, который я пишу вместо Data*
в качестве возврата для рекурсии, я использовал typedef boost::variant
, который имеет сочетание указателей и стандартных типов, что еще больше усложняет отслеживание того, какие указатели должны быть
struct Data {
int a = 2;
Data(int ca) {
a = ca;
}
};
class MemoryLeakCentral {
public:
MemoryLeakCentral(int a) {
doStuff(a);
}
~MemoryLeakCentral() {
/* delete all pointers */
}
Data* createPointer(int a) {
Data* data = new Data(a);
return data;
}
private:
Data* doStuff(int a) {
Data* data = createPointer(5);
/*
do stuff with "data"
e.g.
if(data->a == ...) {
data->a = ...
return doMoreStuff(data)
}
else if(...)
else if(...) etc
*/
return data;
}
Data* doMoreStuff(Data* data) {
/*
do stuff with "data"
if(data->a == ...) {
data->a = ...
return doMoreStuff(data)
}
else if(...)
else if(...) etc
*/
return data;
}
...
//more Data* returning functions
};
В приведенном выше коде я пытаюсь создать впечатление, что рекурсия глубокая и сложная.
Мой вопрос: как лучше всего получить класс MemoryLeakCentral
для удаления всех указателей, которые он генерирует после попадания в деструктор. Одна из моих идей заключалась в том, чтобы сохранить все указатели, созданные в createPointer
в векторе, а затем после вызова ~MemoryLeakCentral
, l oop через вектор и удалить все указатели.
Есть ли что-нибудь лучше решения тогда это? Я знаю точку, в которой создается указатель, но не могу легко определить, где он был уничтожен, из-за имеющейся сложной рекурсии.