我有一个使用 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;
andforward_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
以防止用户在delete
没有先施放它的情况下使用它。哦,对于我可以做的论点AddBar(void* arguments)