代码之家  ›  专栏  ›  技术社区  ›  bjskishore123

如何调用nothrow版本的delete?

  •  11
  • bjskishore123  · 技术社区  · 14 年前

    我有以下代码,不编译:

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

    我得到的错误是:

    错误C2440:“delete”:无法从“const std::nothrow_t”转换为“void*”

    nothrow 版本 delete 存在吗?如果是,我如何调用它?


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

    Here ,有人说不存在这样的事情。

    3 回复  |  直到 11 年前
        1
  •  18
  •   GManNickG    14 年前

    一个 std::nothrow_t 释放函数存在,但不能用 delete 表达。

    释放函数是为了完整性。如果 new operator new 用一个 匹配 呼叫 operator delete . 所以需要有一个 接受 标准::无 ,以允许此操作。

    新的 new (args...) T 将通过调用分配内存 operator new(sizeof(T), args...) . “匹配”是指 操作员删除 除了第一个参数外,其他参数相同。)

    operator delete(memory, std::nothrow); . 但是,a 删除


    所以你可以“调用”它:

    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);
    

    打电话给 版本。

        2
  •  5
  •   Unihedron    11 年前

    没有这种形式的 delete ,因为 删除

    1. 它不执行分配。
    2. 它经常用在不应该抛出的析构函数中!

    使用创建的项 nothrow 新版本将返回NULL,而不是引发错误的分配异常。使用 删除 on NULL是完全有效的,因此不存在应该抛出的情况。

        3
  •  2
  •   Jerry Coffin    14 年前

    new(nothrow) 是作为placement new运算符编写的,但在大多数情况下,没有对应的版本可供删除。唯一的例外是当placement new抛出时调用的delete版本——但是自从(在本例中)您保证 new 无法抛出,该版本的delete在这里没有实际用途/帮助。