c++ - 带有 Placement New 的自定义析构函数

标签 c++ memory memory-management

我有一个使用 placement new 分配的对象.当不再需要该对象时,我明确地使用它的析构函数,然后自己处理内存,如网络上各种来源所述。

然而,我不清楚编译器是否可以为析构函数调用生成任何额外的“后台魔法”,而不仅仅是为析构函数内部的内容生成指令。实际的问题是:在“placement-new”的情况下,有什么能阻止我使用“自定义析构函数”而不是常规(~语法)析构函数吗?简单的类方法,包含所有常用的析构函数代码,但可能另外带有参数。

下面是一个例子:

class FooBar {
  FooBar() { ... }
  ...
  void myCustomDestructor(int withArguments) { ... }
  ...
};

int main() {
  ...
  FooBar* obj = new (someAddress) FooBar();
  ...
  obj->~FooBar();  // <- You're supposed to do this.
  obj->myCustomDestructor(5);  // <- But can you do this instead?
  ...
  // Then do whatever with the memory at someAddress...
}


自定义析构函数有什么缺点吗?

最佳答案

虽然这在技术上是可行的,但我建议不要这样做。

析构函数的存在是有原因的:编译器负责调用所有基类的析构函数。如果您使用自定义析构函数,则需要自己处理(并且很可能会在某处忘记它)。

此外,使用与默认析构函数不同的方法对于任何阅读您代码的人来说都是显而易见的。

您期望使用自定义析构函数有什么好处?我没看到。

关于c++ - 带有 Placement New 的自定义析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14844628/

相关文章:

c++ - 从 .lib 到另一个 .lib 的依赖

javascript - 使用 JavaScript 交换 DOM 元素,用于内存密集型应用程序

mysql - 物理/内存数据库。 (用于在我的网站上记录目的)

java - Android 并在剩余可用堆空间的情况下运行 OOM

c++ - 类型未推断为右值引用 : why not?

c++ - 区分VC++ 2010及以后的编译器版本

C++ 高效使用 new 运算符

c++ - 删除导致程序崩溃的关键字

PHP fatal error 允许内存大小耗尽

c++ - 向 MPI 进程发送函数