警告:'void operator delete(void*, std::size_t)' 调用了未分配的对象

warning: 'void operator delete(void*, std::size_t)' called on unallocated object

我只是在玩 placement-new 运算符。下面的代码在 gcc 版本 11 上编译和运行没有任何错误。2.But 我收到一个警告,

警告:'void operator delete(void*, std::size_t)' 调用了未分配的对象 'buf' [-Wfree-nonheap-object]x86-64 gcc 11.2 #1

请看我试过的代码,

#include<iostream>
class sample
{
    public:
    sample()
    {
        std::cout<<"entered constructor"<<std::endl;
    }

    ~sample()
    {
        std::cout<<"entered destructor"<<std::endl;
    }
};

int main()
{
    unsigned char buf[4];
    sample* k = new(buf) sample; 
    delete k;
    return 0;
}

输出如下(我用的是compiler explorer)

程序返回:139

程序标准输出

进入构造函数

进入析构函数

程序标准错误

free(): 无效指针

分配 新表达式返回的指针以外的任何对象上使用 delete 会导致未定义的行为。

Placement-new 不分配任何东西。您不能 delete 放置新返回的指针。为了销毁使用 placement new 创建的对象,必须显式调用析构函数,或者可以使用 std::destroy_at:

sample* k = new(buf) sample; 
std::destroy_at(k);
// or
// k->~sample();