これは愚かな質問かもしれませんが、私はちょっと混乱しないようにしたいと思っています。私は、この構造体があるとします。どのようにスマートポインタなしでダブル削除を防止するには?
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());
}
私は(すなわち無smartpointers)C++ 11を使用することはできません、と私は100%を確認していない... が、これは両方を削除する正しい方法(または、おそらく唯一のものです
Foo::~Foo(){
if (barX == barY){ delete barX; }
else { delete barX; delete barY; }
}
:)Bar
オブジェクトの?
PS:Foo
はBar
オブジェクトを所有しているため、削除する責任があります。コンストラクタに渡されたBar
は、他の目的には使用されません。実際にBar
は、ただ1つのFoo
にしか属していません(私は後で実現する欠陥ですが、それは今のところうまくいきます)。さらに、Foo
はコピーされていないはずです(多分私はそれを明示的に防ぐべきです)。
誰がバーを所有していますか? –
ブーストスマートポインタはどうですか? – KIIV
@KarolyHorvath Fooがバーを所有しています。 – user463035818