我有利用的std ::修飾符Modifiers像這樣一類:如何禁止或阻止堆棧分配變量的傳遞?
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接受堆棧分配的數據?有沒有更好的方法來設計這個?
編輯 13年6月21日
含內部的delete _bar;
和forward_list.remove(_bar);
for循環,導致運行錯誤迭代增量時。
我選擇保持控股權完全在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)
「禁止[UB]」。在C/C++中?哈哈哈。 – user2246674
您不能簡單地將指針(或引用)存儲到局部變量。你必須存儲副本。 –
你可以採取像boost :: shared_ptr這樣的輸入,而不是原始指針。 –
Dan