我想定义自己的新展示位置和删除展示位置(采用额外的参数),发现可以正确调用展示位置,而我无法访问展示位置删除。谁能告诉我我定义的展示位置删除不正确还是调用不正确?
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;
}
最佳答案
放置delete
仅可用于处理在评估放置new
表达式期间发生的异常。如果构建成功完成,则稍后将使用正常的delete
。
您可以显式调用放置释放函数,但它的行为与delete
运算符不同(它不会自动调用析构函数)。
在您的情况下,相应的代码为:
a->~A();
A::operator delete(a, 4);
!
对于数组,情况甚至更糟,因为您无法从编译器供其自己使用的位置存储元素的数量(以及要调用的析构函数的数量)。
设计重载的
operator new
,使其与一个参数operator delete
正确配对。然后,您的类(class)用户可以使用delete ptr;
和std::unique_ptr
等。如果确实需要自定义释放,那么使用自定义删除器返回
std::shared_ptr
的分配包装器将比自定义放置新的更好。关于c++ - C++自定义放置新和放置删除调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17656686/