警告:'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();
我只是在玩 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();