在 POD 数组上使用 delete 而不是 delete[] 是不是安全? [复制]

Posted

技术标签:

【中文标题】在 POD 数组上使用 delete 而不是 delete[] 是不是安全? [复制]【英文标题】:Is it safe to use delete instead of delete[] on a POD array? [duplicate]在 POD 数组上使用 delete 而不是 delete[] 是否安全? [复制] 【发布时间】:2020-03-27 19:50:29 【问题描述】:

我正在用 C++ 编写一些内存管理代码,一开始我使用char *ptr = new char[1024] 而不是void *malloc(unsigned int size) 来获取缓冲区,此后,我的代码中没有数组的概念,所有操作都是由指针。

但是当我想释放他们时,我有些担心。据我所知,C++ 要求程序员在使用new *type*[] 获取内存时使用delete[],但此时我只得到一个指针(在上面的例子中是ptr)。在编码之前,我认为为什么使用delete[] 是在每个元素上调用析构函数。但我不确定 pod 阵列上的 deletedelete[] 是否有区别。

那么在 pod 阵列上使用 delete ptr 是否安全?

【问题讨论】:

new[] 与普通的delete 匹配会导致未定义的行为,故事结束。只是不要做这样的事情。 @Someprogrammerdude 简洁,谢谢。 我很抱歉可能听起来有点粗鲁,但真的没什么好说的了 :) 不安全。 delete vs delete[] operators in C++、The difference between delete and delete[] in C++ 等可能重复。有关问题的具体示例,请参阅 Raymond Chen 的 Mismatching scalar and vector new and delete。 【参考方案1】:

new 附带deletenew [] 附带delete []。你没有其他option:

由删除表达式调用以释放先前的存储空间 分配给单个对象。标准库的行为 除非 ptr 为空,否则此函数的实现是未定义的 指针 或 是先前从标准库中获得的指针 operator new(size_t) 或 operator new(size_t, std::nothrow_t)。

混合使用这些运算符会导致未定义的行为。

【讨论】:

以上是关于在 POD 数组上使用 delete 而不是 delete[] 是不是安全? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

调用 free() 或 delete 而不是 delete[] 有啥危险吗? [复制]

删除与删除 [] [重复]

删除与删除 [] [重复]

C++ delete[] 是不是足以在数组后清理?

删除数组时delete和delete[]一样吗? [复制]

在动态分配的数组上使用 auto_ptr 的正确方法是啥?