gpt4 book ai didi

c++ - 当构造函数抛出异常并使用自定义 new 时,C++ 如何释放内存

转载 作者:IT老高 更新时间:2023-10-28 23:01:20 32 4
gpt4 key购买 nike

我看到以下构造:

    如果 X 构造函数抛出,
  • new X 将释放内存。

  • operator new() 可以重载。

operator new 重载的规范定义是 void *operator new(size_t c, heap h) 和对应的 operator delete

最常见的operator new重载是placement new,即void *operator new(void *p) { return p; }

你几乎总是不能在放置 new 的指针上调用 delete

这引出了一个问题:当 X 构造函数抛出并使用重载的 new 时,如何清理内存?

最佳答案

从根本上说,如果没有对应于 new 运算符的 delete 运算符,则什么也不做。在放置 new 的情况下也不做任何事情,因为相应的放置删除操作符是空操作。异常不会被转移:它会继续运行,因此 new 的调用者有机会(和责任)释放分配的内存。

Placement new 之所以被称为是因为它用于将对象放置在内存中,否则会获得;由于内存不是由 new 运算符获取的,因此它不太可能被 delete 运算符释放。实际上,这个问题没有实际意义,因为(至少从 C++03 开始​​)不允许替换放置 new 运算符(它具有原型(prototype) operator new(size_t, void*) 或 delete ( operator delete(void*, void*))。提供的placement new 运算符返回其第二个参数,提供的placement delete 运算符是空操作。

其他 newdelete 操作符可以被替换,无论是全局的还是特定的类。如果调用了自定义的new操作符,构造函数抛出了异常,并且有对应的delete操作符,那么会在异常之前调用那个delete操作符进行清理被传播。但是,如果没有对应的 delete 操作符,也不是错误。

关于c++ - 当构造函数抛出异常并使用自定义 new 时,C++ 如何释放内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19686769/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com