【问题标题】:C/C++ delete vs delete[] [duplicate]C / C ++删除与删除[] [重复]
【发布时间】:2012-07-03 11:41:35
【问题描述】:

可能重复:
How could pairing new[] with delete possibly lead to memory leak only?
delete vs delete[]

我刚开始学习 C/C++,有人告诉我使用 delete 删除单个对象并将 delete [] 用于数组。

然后我发现this website提出了这个问题

这段代码有什么问题吗?

T *p = new T[10];
delete p;

注意:不正确的回答:“不,一切都是正确的”,“只有第一个 数组的元素将被删除”,“整个数组将 删除,但只会调用第一个元素的析构函数”。

这就提出了一个问题,在该代码块中发生了什么?从逻辑上讲,我会认为这是“只有数组的第一个元素会被删除”,但似乎没有。任何人都可以对此有所了解吗?

【问题讨论】:

  • C/C++ 是两种完全不同的语言。删除 C 标记,因为 new 仅是 C++。
  • 链接的问题中没有直接提到,但是要知道构造了多少个对象,计数必须存储在分配的块中,通常编译器会注入分配内存的代码,存储整数和将指针sizeof(size_t) 字符返回到构造第一个元素的缓冲区中。对于不需要存储计数的new,情况并非如此。 delete(与new配对)只会调用析构函数并释放指针中的内存,delete []必须调用析构函数,并传递一个由sizeof(size_t)偏移的指针以释放
  • ... 因为被释放的指针不是被分配的指针,在很多情况下(包括malloc/free)就是违约。

标签: c++ delete-operator


【解决方案1】:
  • delete:这将释放当前由执行删除的指针分配的内存。它删除第一个变量指向的内存。

  • delete []:这会释放为整个数组分配的内存。一个数组由几个变量组成——delete只释放分配给第一个变量的内存,而 delete [] 完成整个事情。

考虑它的一个好方法是将delete视为一条指令,而将delete []视为一个循环;其中数组循环并在数组中的每个变量上单独调用删除。这不是它在现实中的工作方式(实际工作方式要复杂一些),但这是理解差异的好方法。

对所有对象调用析构函数,因为在某些情况下,例如在包含指针的对象数组的情况下,仅对第一个元素调用析构函数不会释放所有内存。

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 2022-01-05
    • 1970-01-01
    • 2016-08-15
    • 2020-09-12
    • 2020-09-11
    相关资源
    最近更新 更多