【发布时间】:2023-03-22 11:29:01
【问题描述】:
我想定义我自己的展示位置 new 和展示位置删除(采用额外参数),我发现我可以正确调用展示位置,而我无法访问展示位置删除。谁能告诉我是我错误地定义了展示位置删除还是我错误地调用了它?
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;
}
【问题讨论】:
-
这看起来不像是新放置,尤其是您实例化
A *指针的方式(不确定 10 是否是正确的内存位置:P)。看这里:parashift.com/c++-faq/placement-new.html -
@Xaqq:它是一种的放置新形式,但不是最常见的一种,它传递对象将被放置的地址。
-
我宁愿单独留下
new和delete,而是定义适当的构造函数/析构函数——即使它有效,但它没有,如果A * a = new A的行为与A a -
在你的类A的构造函数中,构造函数的参数a与成员变量同名:a。永远不要陷入将参数命名为与成员变量相同的陷阱。如果你对你的编译器撒谎,它可能会相信你。
标签: c++ placement-new placement