更好的方法来创建对象的数组,然后有效地删除它们

时间:2014-08-27 10:27:32

标签: c++ arrays

我有一个名为"菜单"的类,这个类有一个指向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!。除了这个析构函数,一切都很好。如果我不打电话给这个析构函数就没有错误。我想知道如何解决这个问题?我想删除这个数组,以便我的记忆变得干净。

2 个答案:

答案 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)

我发布的代码没有错。

虽然在对象被破坏时发生了断言,但明显的错误发生在其他地方;在对象一生中的某个时刻,有些东西被潦草地写下来了。

这种调试断言并不意味着“现在发生了错误!”。这意味着“错误发生在前一段时间,我只是注意到了它!”,基本上。

查找代码中其他位置的错误。有许多调试工具可以检测代码,并尝试识别未定义的行为,例如踩踏未初始化或未分配的内存。