C++ - 在删除堆上分配的任务数组时,添加列表<Task> l(或任何STL Container)作为数据成员会导致错误

mac*_*guy 0 c++ memory debugging pointers

我有一个叫做Task的课.头文件如下:

class Task
{
public:
    Task();
//Methods Declarations

private:

int uid;
list<Task> l;

    friend ostream & operator<<(ostream & os, const Task &t);
    friend ostream & operator<<(ostream & os, const list<Task *> &l);
};
Run Code Online (Sandbox Code Playgroud)

现在在我的主文件中,我运行:

Task * tasks[7];
for (int i = 0; i != 7; ++i)
    tasks[i] = new Task();

delete [] *tasks;
Run Code Online (Sandbox Code Playgroud)

在运行时,delete[] *tasks;我收到以下错误消息:

Assignment 4(23901) malloc: *** error for object 0x1001009f8: pointer being 
                                freed was not allocated *** set a breakpoint in 
                                malloc_error_break to debug
Run Code Online (Sandbox Code Playgroud)

一旦我注释掉list < Task *> l并重新运行它,错误消息就会消失.我试过改变list < Task * > l,list < Task > l但是没有用.

我无法弄清楚.为什么它会list < Task >在堆栈上分配时出错(指向堆元素的指针)?(STL管理).也试过了vector<int>.我得到了同样的东西.

更新:删除任务[i]没有做到这一点.

Luc*_*ore 5

你不用

delete [] *tasks;
Run Code Online (Sandbox Code Playgroud)

for (int i = 0; i != 7; ++i)
    delete tasks[i];
Run Code Online (Sandbox Code Playgroud)

  • @macguy:`删除它们只是使内存可重用,删除的内容可能/可能不一定从内存位置删除(取决于实现).但是,在"删除"它们之后访问元素是**未定义行为**. (2认同)