Base* p = new(buf) Base; 是什么意思?
What is the meaning of Base* p = new(buf) Base;
我最近遇到了一些 C++ 代码,这些代码应该说明可能在 valgrind、gdb、insure 等中捕获的许多不同类型的错误...
其中一个例子如下:
// =============================================================================
// A base class without a virtual destructor
class Base
{
public:
~Base() { std::cout << "Base" << std::endl; }
};
// Derived should not be deleted through Base*
class Derived : public Base
{
public:
~Derived() { std::cout << "Derived" << std::endl; }
};
// A class that isn't Base
class NotBase
{
public:
~NotBase() { std::cout << "NotBase" << std::endl; }
};
// =============================================================================
// Wrong delete is called. Should call ~Base, then
// delete[] buf
void placement_new()
{
char* buf = new char[sizeof(Base)];
Base* p = new(buf) Base;
delete p;
}
我的问题与以下行有关:
Base* p = new(buf) Base;
我在多次谷歌搜索之前和之后从未见过这种语法,我什至不确定在寻找解释时要搜索什么。
谁能指出我正确的方向?如果这是多余的或简单的,我深表歉意,但我很好奇这个例子中发生了什么。
谢谢。
它是全新的。它在一块已经分配的内存上调用构造函数。
通常 new 执行 2 个功能:
为对象分配内存
通过初始化将内存变成一个对象
placement-new 只做第二位。
它在 stl 分配器实现中被大量使用。
我最近遇到了一些 C++ 代码,这些代码应该说明可能在 valgrind、gdb、insure 等中捕获的许多不同类型的错误...
其中一个例子如下:
// =============================================================================
// A base class without a virtual destructor
class Base
{
public:
~Base() { std::cout << "Base" << std::endl; }
};
// Derived should not be deleted through Base*
class Derived : public Base
{
public:
~Derived() { std::cout << "Derived" << std::endl; }
};
// A class that isn't Base
class NotBase
{
public:
~NotBase() { std::cout << "NotBase" << std::endl; }
};
// =============================================================================
// Wrong delete is called. Should call ~Base, then
// delete[] buf
void placement_new()
{
char* buf = new char[sizeof(Base)];
Base* p = new(buf) Base;
delete p;
}
我的问题与以下行有关:
Base* p = new(buf) Base;
我在多次谷歌搜索之前和之后从未见过这种语法,我什至不确定在寻找解释时要搜索什么。
谁能指出我正确的方向?如果这是多余的或简单的,我深表歉意,但我很好奇这个例子中发生了什么。
谢谢。
它是全新的。它在一块已经分配的内存上调用构造函数。
通常 new 执行 2 个功能:
为对象分配内存
通过初始化将内存变成一个对象
placement-new 只做第二位。
它在 stl 分配器实现中被大量使用。