我一直在阅读一下,当你使用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)
但是析构函数没有释放内存,对吧? 这会是内存泄漏吗?
我很困惑,你能解释一下吗?
为什么通过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
c++ ×2