Возможно, это глупый вопрос, но я просто хочу быть уверенным, чтобы не испортить материал. Предположу, у меня есть эта структура:Как предотвратить двойное удаление без интеллектуальных указателей?
struct Foo{
struct Bar { virtual int calc(int x) = 0; };
Bar* barX;
Bar* barY;
int x,y;
Foo(Bar* bx,Bar* by) : barX(by),barY(by) {}
void process(int xx,int yy){
x = barX->calc(xx);
y = barY->calc(yy);
}
~Foo();
};
struct IDBar : Foo::Bar { int calc(int x) { return x; } };
int main() {
IDBar* b = new IDBar();
Foo f = Foo(b,b);
Foo f2 = Foo(new IDBar(),new IDBar());
}
Я не могу использовать C++ 11 (т.е. нет smartpointers), и я не уверен на 100% ... Это правильный способ удалить оба (или, возможно, только один) из Bar
объектов:
Foo::~Foo(){
if (barX == barY){ delete barX; }
else { delete barX; delete barY; }
}
?
PS: Идея состоит в том, что Foo
владеет объектами Bar
(таким образом, они будут нести ответственность за их удаление). Bar
s, переданные конструктору, не должны использоваться ни для чего другого. На самом деле Bar
может принадлежать только одному Foo
(недостаток, который я понял только позже, но на данный момент это нормально). Более того, Foo
не должен быть скопирован (возможно, я должен это явно запретить).
Кому принадлежит Бары? –
Как насчет импульсных интеллектуальных указателей? – KIIV
@ KarolyHorvath Foo владеет барами. – user463035818