【发布时间】:2015-03-02 08:06:35
【问题描述】:
我有奇怪的断言错误,我找不到这段代码有什么问题。
断言表达式是_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
这个想法是一个对象女巫继承了 Creator,可以创建任何其他对象,并持有指向这些对象的指针。虽然程序员可以使用引用。而当“超级”对象被销毁时,所有“子”对象也会被销毁。
如果我改为:
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();
}
现在 create 方法只创建一种类型的对象(本例中的对象 A )。 但我需要,该 create 方法可以创建任何继承 MyObject 的对象。就像在代码的第一次和平中一样。
对此断言错误的任何帮助将不胜感激。谢谢。
【问题讨论】:
-
MyObject是什么?它的析构函数是虚拟的吗? -
你没有在这里显示
MyObject类。 -
我不确定你是否可以在for循环中执行
item = 0;,但至少它没有用。 -
MyObject 在这个例子中是一个空类。
-
@Wimmel:为什么不“允许”?不过确实没用。
标签: c++ inheritance runtime-error assertion delete-operator