相关疑难解决方法(0)

如何正确释放新安置分配的内存?

我一直在阅读一下,当你使用placement new时,你必须手动调用析构函数.

考虑下面的代码:

   // Allocate memory ourself
char* pMemory = new char[ sizeof(MyClass)];

// Construct the object ourself
MyClass* pMyClass = new( pMemory ) MyClass();

// The destruction of object is our duty.
pMyClass->~MyClass();
Run Code Online (Sandbox Code Playgroud)

据我所知,运算符delete通常会调用析构函数然后释放内存,对吧?那么我们为什么不用delete呢?

delete pMyClass;  //what's wrong with that?
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,我们被迫将pMyClass设置为nullptr在我们调用析构函数之后:

pMyClass->~MyClass();
pMyClass = nullptr;  // is that correct?
Run Code Online (Sandbox Code Playgroud)

但是析构函数没有释放内存,对吧? 这会是内存泄漏吗?

我很困惑,你能解释一下吗?

c++ placement-new

23
推荐指数
3
解决办法
6266
查看次数

为什么删除void*是UB而不是编译错误?

为什么通过void*未定义的行为而不是编译错误来删除对象?

void foo(void* p) {
    delete p;
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译并生成代码,虽然gcc和clang上有警告(令人惊讶的是,ICC没有发出警告):

:2:5:警告:无法删除带有指针''''''的类型'void*'[-Wdelete-incomplete]

为什么不是简单的格式错误的程序,语法无效?貌似标准没有花太多时间就可以了,在说[expr.delete]

这意味着无法使用void*类型的指针删除对象,因为void不是对象类型.

我有什么理由不知道为什么这不会触发硬编译错误?

c++ void-pointers undefined-behavior language-lawyer delete-operator

10
推荐指数
1
解决办法
578
查看次数