gpt4 book ai didi

c++ - 如何调用删除的 nothrow 版本?

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

我有以下代码,但无法编译:

int *p = new(nothrow) int;
delete (nothrow) p; //Error

我得到的错误是:

error C2440: 'delete' : cannot convert from 'const std::nothrow_t' to 'void*'

nothrow 版本的 delete 是否存在?如果是这样,我该如何调用它?


In C++: The Complete Reference,它是存在的,但我在网上看到了不同的意见,因此感到困惑。

MSDN也谈到了它的存在,但我找不到它如何在代码中使用。

Here ,有人说没有这种事。

最佳答案

std::nothrow_t 释放函数存在,但您不能使用 delete 表达式调用它。

释放功能是为了完整性。如果 new 表达式因异常而失败,编译器需要释放它通过 operator new 分配的内存,并通过 ma​​tching 调用 运算符(operator)删除。所以需要有一个接受 std::nothrow_toperator delete 来允许这样做。

(也就是说,一般来说,new (args...) T 形式的 new 表达式将通过调用 operator new 来分配内存(sizeof(T), args...)。“匹配”是指使用相同的参数调用operator delete,除了第一个。)

注意你可以直接调用操作符:operator delete(memory, std::nothrow);。但是,delete 表达式永远不会调用带有附加参数的全局释放函数。


所以你可以“调用”它:

struct always_throw
{
always_throw() { throw std::exception(); }
};

new (std::nothrow) always_throw;

在某些时候,这将通过调用来分配内存:

void* __memory = operator new(sizeof(always_throw), std::nothrow);

由于对象的初始化抛出,编译器需要使用匹配的释放函数释放分配的内存,所以它这样做:

operator delete(__memory, std::nothrow);

调用 std::nothrow_t 版本。

关于c++ - 如何调用删除的 nothrow 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4005601/

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