c++ - C++ 中的 nothrow delete 是什么?

标签 c++ visual-c++ memory-management

This MSDN page提到没有 newdelete 的抛出版本。 nothrow new 是众所周知的事情 - 如果内存分配失败,则返回 null 而不是抛出异常。但是那里提到的nothrow delete是什么?

最佳答案

他们可能指的是原始内存分配函数 operator newoperator delete

当您调用特定版本的放置新表达式(即带有额外参数的新表达式;它们都正式称为 new放置形式)和内存分配函数 operator new 成功,但由于某些其他原因(构造函数抛出)稍后进程失败,实现必须中止进程并通过调用适当版本的 运算符删除。在这种情况下,operator delete 的“适当版本”是与之前用于内存分配的 operator new 函数具有相同参数集的版本(除了第一个当然是参数)。

这也适用于 operator newnothrow 版本。当您使用 nothrow 形式的 new 表达式时,它会调用 operator newnothrow 版本,然后在分配的内存中构造对象。如果构造函数失败(抛出),new 表达式的实现将在 nothrow 版本的 operator delete 的帮助下释放分配的内存。这基本上是此版本 operator delete 存在的唯一原因。

换句话说,operator deletenothrow 版本的存在是为了非常具体的内部目的。你通常不应该自己调用它,也许你真的不需要知道它的存在。然而,值得注意的是,由于上述原因,每当您创建自己的带有额外参数的 operator new 版本时,最好提供一个匹配版本的 operator delete 具有相同的一组额外参数。

关于c++ - C++ 中的 nothrow delete 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1960740/

相关文章:

c++ - OpenSSL 在客户端和服务器之间建立连接

java - 如何查看幸存者空间中的物体

c++ - 在混合 C/C++ 程序中协调 malloc 和 new 的 "correct"方法是什么?

c++ - 使用 Xcode 7.3.1 编译时出现“unordered_map”文件未找到错误

c++ - Windows 上的 PEM_read_bio_RSAPrivateKey() 差异

c++ - 使用 scanf 的奇怪输出

visual-c++ - 查询: Integrating libsndfile with Visual Studio 2010 C++.错误: libsndfile.找不到dll

c++ - 是否有一个特殊的地方来存储标准 C++ 中的配置

c++ - std:string 和 std::string 之间的区别

C++ 内存管理范例