Base*p=新(buf)Base的含义是什么; 我最近遇到了一些C++代码,它可以说明在ValGRND、GDB、保险等中可能会遇到的许多不同类型的错误,以及……

Base*p=新(buf)Base的含义是什么; 我最近遇到了一些C++代码,它可以说明在ValGRND、GDB、保险等中可能会遇到的许多不同类型的错误,以及……,c++,valgrind,C++,Valgrind,其中一个例子如下: // ============================================================================= // A base class without a virtual destructor class Base { public: ~Base() { std::cout << "Base" << std::endl; } }; // Derived should n

其中一个例子如下:

// =============================================================================
// 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;
}
我从来没有见过这种语法,在谷歌搜索了很多次之后,我甚至不知道在寻找解释时应该搜索什么

谁能给我指出正确的方向吗?如果这是多余的或简单的,我深表歉意,但我很好奇在这个例子中发生了什么


谢谢。

这是新的。它在已经分配的内存块上调用构造函数

通常情况下,new执行两项功能:

  • 为对象分配内存

  • 通过初始化将内存转换为对象

placement new只执行第二位


它在stl分配器实现中被大量使用。

它是新的。它在已经分配的内存块上调用构造函数

通常情况下,new执行两项功能:

  • 为对象分配内存

  • 通过初始化将内存转换为对象

placement new只执行第二位


它在stl分配器实现中被大量使用。

它是新的。它在已经分配的内存块上调用构造函数

通常情况下,new执行两项功能:

  • 为对象分配内存

  • 通过初始化将内存转换为对象

placement new只执行第二位


它在stl分配器实现中被大量使用。

它是新的。它在已经分配的内存块上调用构造函数

通常情况下,new执行两项功能:

  • 为对象分配内存

  • 通过初始化将内存转换为对象

placement new只执行第二位


它在stl分配器实现中被大量使用。

查找“placement new”。一般而言,查找
new
可能会导致您查找“placement new”。一般而言,查找
new
可能会导致您查找“placement new”。一般而言,查找
new
可能会导致您查找“placement new”.一般来说,查找
new
可能会使您现在有意义,谢谢。现在有意义,谢谢。现在有意义,谢谢。现在有意义,谢谢。现在有意义,谢谢。
Base* p = new(buf) Base;