【发布时间】: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