首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否在new[]运算符未定义的行为分配的内存上调用delete运算符?

是否在new[]运算符未定义的行为分配的内存上调用delete运算符?
EN

Stack Overflow用户
提问于 2015-05-06 08:39:50
回答 1查看 119关注 0票数 1

我很确定它是正确的,但如果我正确地解释标准(第18.6.1.2节new.delete.array)提到:

空操作符,删除void* ptr,no以外;指针。 。13默认行为:调用运算符删除(Ptr)

由于在默认行为中,delete[]只调用其delete(ptr)等效项,那么为什么要考虑调用哪个版本呢?我尝试用一个示例代码来验证这一点,结果它崩溃了,这使得不匹配的new[]和delete确实导致了糟糕的事情变得更加明显。

代码语言:javascript
复制
#include <iostream>
#include <memory>
class foo{
    public:
        void bar(){
            std::cout << "foo's bar" << std::endl;
        }
        ~foo(){
            std::cout << "foo dies after this" << std::endl;
        }
};
int main() {
    std::shared_ptr<foo> x(new foo[10]);
    return 0;
}

应如何解释标准中的上述引文?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-06 08:56:31

您混淆了delete[]表达式和函数operator delete[]。当你写:

代码语言:javascript
复制
delete[] p;

然后编译器发出代码,它将为p指向的数组中的所有对象调用析构函数,然后使用参数p调用去分配函数operator delete[]。根据您引用的文档,默认的::operator delete[]调用::operator delete。因此,在使用默认实现时,以下对解除分配函数的调用是等效的:

代码语言:javascript
复制
::operator delete[] (p);
::operator delete(p);

但是,以下是而不是等效的,因为它们所做的不仅仅是调用去分配函数:

代码语言:javascript
复制
delete[] p;
delete p;
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30071603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档