次のように std::forward_list を利用するクラスがあります。
void Foo::AddBar(Bar* _bar)
{
Bars.push_front(_bar);
}
void Foo::DeleteBar(Bar* _bar)
{
for (forward_list::iterator index = Bars.begin(); index != Bars.end(); ++index)
{
if (_bar == *index)
{
delete _bar;
forward_list.remove(_bar);
}
}
}
スタックに割り当てられた変数を渡すと、デバッグ/リリースで実行時エラーが発生し、本番環境ではヒープが「マングル」されます。
Bar bar;
foo.AddBar(&bar);
foo.DeleteBar(&bar); // Memory corruption on "delete _bar"
Foo::AddBar がスタックに割り当てられたデータを受け入れないようにするにはどうすればよいですか? これを設計するより良い方法はありますか?
2013 年 6 月 21 日を編集
for ループ内にdelete _bar;
andを含めると、反復子がインクリメントするときに実行時エラーが発生します。forward_list.remove(_bar);
私は所有権の管理を完全に Foo に保持し、次のようなテンプレートを使用することにしました。
template<class T> T* AddBar()
{
Bar* object = new T();
Bars.push_front(object);
return object;
}
// Usage looks like...
Process* pid = foo.AddBar<MyBar>(); // adding a subclass of Bar
私はポインターを PID として使用しています - ルックアップの目的で。最初にキャストせずint
にユーザーが ing するのを防ぐために、いつでも戻ることができました。delete
ああ、私ができる議論のためにAddBar(void* arguments)