我有奇怪的斷言錯誤,我找不到這個代碼有什麼問題。C++斷言錯誤,同時刪除對象
斷言表達式是_BLOCK_TYPE_IS_VALID(pHead-> nBlockUse)。
我簡化了代碼以提高可讀性。
class Creator
{
public:
virtual ~Creator()
{
for (MyObject* item : _list)
{
delete item; <-- assertion error here
item = 0;
}
_list.clear();
}
template <class T>
T& create()
{
T * item = new T();
_list.push_back(item);
return *item;
}
private:
std::list<MyObject*> _list;
};
class A : public MyObject, public Creator
{
};
class B : public MyObject, public Creator
{
};
int main()
{
A a;
a.create<A>();
} <-- call of destructor
的想法是,一個對象女巫繼承者,可以創建任何其他對象,並保持指向的對象。程序員可以使用引用。當「超級」對象被銷燬時,所有「子」對象也被銷燬。
計劃得好好的,如果我更改爲:
template <class T>
class Creator
{
public:
virtual ~Creator()
{
for (T* item : _list)
{
delete item;
item = 0;
}
_list.clear();
}
T& create()
{
T * item = new T();
_list.push_back(item);
return *item;
}
private:
std::list<T*> _list;
};
class A : public MyObject, public Creator<A>
{
};
class B : public MyObject, public Creator<B>
{
};
int main()
{
A a;
a.create();
}
現在創建方法(在這個例子中的物體A)只創建一個類型的對象。 但我需要,該創建方法可以創建任何繼承MyObject的對象。就像代碼的第一次和平一樣。
任何幫助這個斷言錯誤將不勝感激。謝謝。
什麼是MyObject?它的析構函數是虛擬的嗎? –
您在此處未顯示「MyObject」類。 – Ankur
我不確定你可以在for循環中執行'item = 0;',但至少它沒用。 – wimh