gpt4 book ai didi

C++自定义placement new和placement delete调用

转载 作者:行者123 更新时间:2023-11-30 01:21:45 24 4
gpt4 key购买 nike

我想定义自己的 placement new 和 placement delete(采用额外参数),我发现我可以正确调用 placement,但无法访问 placement delete。谁能告诉我是我错误地定义了 placement delete 还是我错误地调用了它?

class A
{
public:
A( int a ) : a(a){}

static void* operator new( std::size_t, int ); // the placement new
static void operator delete( void*, int )throw(); // the corresponding placement delete
private:
int a;
};

void* A::operator new( std::size_t size, int n )
{
std::cout << "size: " << size << " " << "n: " << n << std::endl;
return ::operator new(size);
}

void A::operator delete( void* p, int n )throw()
{
std::cout << "n: " << n << std::endl;
::operator delete(p);
}

int main( int argc, char* argv[] )
{
A* a = new(10) A(100);

std::cout << std::endl;

delete(4) a; // error???????????????????, but how?

return 0;
}

最佳答案

Placement delete 仅可用于处理在评估 placement new 表达式期间发生的异常。如果构造成功完成,则稍后将使用正常的 delete

您可以显式调用放置释放函数,但它不会具有与 delete 运算符相同的行为(它不会自动调用析构函数)。

在您的情况下,相应的代码将是:

a->~A();
A::operator delete(a, 4);

讨厌!

对于数组,情况更糟,因为您无法从编译器存储元素的位置检索元素的数量(以及要调用的析构函数的数量)以供自己使用。

设计重载的 operator new 使其与单参数 operator delete 正确配对。然后你的类的用户可以使用 delete ptr;std::unique_ptr

如果您确实需要自定义释放,那么使用自定义删除器返回 std::shared_ptr 的分配包装器将比自定义放置新的更好。

关于C++自定义placement new和placement delete调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17656686/

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