我有一个名为"菜单"的类,这个类有一个指向Class" MenuItem"的对象的数组。 Menu类的前三个相关行看起来像:
class Menu
{
MenuItem *items[5];
在菜单类I的构造函数中,创建items
为:
for(int i=0; i<nItems; i++)
{
items[i] = new MenuItem(titles[i],...); //with all necessary parameters
在菜单类I的析构函数中,将items
删除为:
~Menu()
{
for(int i=0; i<nItems; i++)
delete items[i];
问题:我的问题是,当我调用这个析构函数时,我得到了一个错误Debug Assertion Failed!
。除了这个析构函数,一切都很好。如果我不打电话给这个析构函数就没有错误。我想知道如何解决这个问题?我想删除这个数组,以便我的记忆变得干净。
答案 0 :(得分:3)
如果没有更多的上下文,很难说你的问题是什么(虽然我会打赌复制构造函数和/或赋值运算符的问题,或nItems
的错误值)。
管理这些原始指针的更好方法是首先不要使用它们。
考虑一下:
一系列智能指针:
std::unique_ptr<MenuItem> items[5];
或std::array
智能指针:
std::array<std::unique_ptr<MenuItem>, 5> items;
或vector<>
智能指针:
std::vector<std::unique_ptr<MenuItem>> items;
答案 1 :(得分:1)
我发布的代码没有错。
虽然在对象被破坏时发生了断言,但明显的错误发生在其他地方;在对象一生中的某个时刻,有些东西被潦草地写下来了。
这种调试断言并不意味着“现在发生了错误!”。这意味着“错误发生在前一段时间,我只是注意到了它!”,基本上。
查找代码中其他位置的错误。有许多调试工具可以检测代码,并尝试识别未定义的行为,例如踩踏未初始化或未分配的内存。