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

C++ 创建对象的更好方法';数组,然后有效地删除它们,c++,arrays,C++,Arrays,我有一个名为“Menu”的类,这个类有一个指向“MenuItem”类对象的指针数组。菜单类的前三行相关内容如下所示: class Menu { MenuItem *items[5]; 在Menu类的构造函数中,我正在创建项,如下所示: for(int i=0; i<nItems; i++) { items[i] = new MenuItem(titles[i],...); //with all necessary parameters ~Menu() { for(int

我有一个名为“Menu”的类,这个类有一个指向“MenuItem”类对象的指针数组。菜单类的前三行相关内容如下所示:

class Menu
{
    MenuItem *items[5];
在Menu类的构造函数中,我正在创建
,如下所示:

for(int i=0; i<nItems; i++)
{
    items[i] = new MenuItem(titles[i],...); //with all necessary parameters
~Menu()
{
for(int i=0; i<nItems; i++)
    delete items[i];

问题:我的问题是,当我调用这个析构函数时,我得到了一个错误
Debug断言失败。除了这个析构函数,一切都很好。如果我不调用这个析构函数,就没有错误。我想知道如何解决这个问题?我想删除这个数组,这样我的内存就干净了。

如果没有更多的上下文,很难说问题出在哪里(尽管我打赌复制构造函数和/或赋值运算符有问题,或者
nItems的值有误)

管理这些原始指针的更好方法是,首先不要使用它们

考虑:

智能指针数组:

std::unique_ptr<MenuItem> items[5];
std::array<std::unique_ptr<MenuItem>, 5> items;
std::vector<std::unique_ptr<MenuItem>> items;
或智能指针的
向量

std::unique_ptr<MenuItem> items[5];
std::array<std::unique_ptr<MenuItem>, 5> items;
std::vector<std::unique_ptr<MenuItem>> items;
std::向量项;

如果没有更多的上下文,很难说你的问题出在哪里(尽管我打赌复制构造函数和/或赋值运算符会出问题,或者
nItems的值是错误的)

管理这些原始指针的更好方法是,首先不要使用它们

考虑:

智能指针数组:

std::unique_ptr<MenuItem> items[5];
std::array<std::unique_ptr<MenuItem>, 5> items;
std::vector<std::unique_ptr<MenuItem>> items;
或智能指针的
向量

std::unique_ptr<MenuItem> items[5];
std::array<std::unique_ptr<MenuItem>, 5> items;
std::vector<std::unique_ptr<MenuItem>> items;
std::向量项;

我看不出你发布的代码有什么问题

虽然断言发生在对象被销毁时,但明显的错误发生在其他地方;在对象生命周期的某个时刻,有东西被涂鸦了

这种调试断言并不意味着“错误现在就发生了!”。它的意思是“这个错误发生在很久以前,我刚刚注意到了!”,基本上是这样


在代码的其他地方查找bug。有许多调试工具可以插入代码,并尝试识别未定义的行为,如踩在未初始化或未分配的内存上。

我看不出您发布的代码有任何错误

虽然断言发生在对象被销毁时,但明显的错误发生在其他地方;在对象生命周期的某个时刻,有东西被涂鸦了

这种调试断言并不意味着“错误现在就发生了!”。它的意思是“这个错误发生在很久以前,我刚刚注意到了!”,基本上是这样



在代码的其他地方查找bug。有许多调试工具可以插入代码,并尝试识别未定义的行为,如踩踏未初始化或未分配的内存。

如果在我的程序中nItems是
nItems=4
但断言是什么?我对此一无所知!内存管理很棘手;你可能没有正确地遵循规则。为什么不使用
std::vector
和/或
std::unique\u ptr
,它们是专门为正确管理内存而设计的,而不是处理指针并希望得到最好的结果呢?如果在我的程序
nItems=4
中nItems是,那么断言是什么呢?我对此一无所知!内存管理很棘手;你可能没有正确地遵循规则。为什么不使用
std::vector
和/或
std::unique_ptr
,它们是专门为正确管理内存而设计的,而不是处理指针并希望得到最好的结果?实际上,我的程序在不删除析构函数中的对象数组的情况下运行得非常好。代码的其他部分显然会导致内存损坏。这就是调试断言告诉您的。如果没有显式释放为此对象分配的内存,则进程将终止。不需要从堆中进一步分配或取消分配内存,因此不会发现此问题。不幸的是,忽视一个问题并不能使它消失。如果你不得不向你的程序添加更多的代码或逻辑,如果你需要改变它,在某种程度上,你很可能会点击这个断言,立即终止它。我发现了这个bug,我不需要为一个简单的对象(菜单类)调用析构函数(不是指向菜单类的指针)。实际上,我的程序在不删除析构函数中的对象数组的情况下运行得非常好。代码的其他部分显然导致了内存损坏。这就是调试断言告诉您的。如果没有显式释放为此对象分配的内存,则进程将终止。不需要从堆中进一步分配或取消分配内存,因此不会发现此问题。不幸的是,忽视一个问题并不能使它消失。如果你不得不向你的程序添加更多的代码或逻辑,如果你需要改变它,在某种程度上,你很可能会点击这个断言,立即终止它。我发现了这个bug,我不需要为一个简单的对象(菜单类)调用析构函数(不是指向菜单类的指针)。我将如何初始化这些菜单项向量?@AliMohyudin使用
项。向后推(std::unique_ptr(new MenuItem(…))项。推回(std::unique_ptr(new MenuItem(…)