在 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 阵列上的 delete
和 delete[]
是否有区别。
那么在 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
附带delete
。 new []
附带delete []
。你没有其他option:
由删除表达式调用以释放先前的存储空间 分配给单个对象。标准库的行为 除非 ptr 为空,否则此函数的实现是未定义的 指针 或 是先前从标准库中获得的指针 operator new(size_t) 或 operator new(size_t, std::nothrow_t)。
混合使用这些运算符会导致未定义的行为。
【讨论】:
以上是关于在 POD 数组上使用 delete 而不是 delete[] 是不是安全? [复制]的主要内容,如果未能解决你的问题,请参考以下文章