c++ - 删除放置或非放置新

标签 c++ memory-management destructor

有谁知道一个 C++ 删除过程,它对放置新的和常规的新的都是安全的?

Object* regular = new Object();
delete_procedure(regular);

void* buf = ::new(sizeof(Object));
Object* placement = new(buf) Object();
delete_procedure(placement);

这个函数似乎可以工作,但我无法弄清楚它对这两个实例是否真的安全(这是删除 placement new 的标准方法)。

delete_procedure(Object* obj){ // Not sure if safe for regular new
  obj->~Object();
  ::delete(obj);
}

最佳答案

如果不引入一些额外的标志来标记事物,我认为没有任何统一的方法可以做到这一点。 C++ 的哲学是“你需要跟踪你是如何分配东西并确保它们都被正确销毁”,它这样做是为了提高效率。想想 delete[]delete。可以有一个统一的 delete 关键字来清除任何内存块,但是由于确定需要调用哪个释放例程的成本,这会产生性能开销。或者想想虚拟析构函数:C++ 可以说 delete 总是进行某种类型的自省(introspection),但这会增加所有对象类型的开销,其中大部分是不必要的。

C++ 的哲学是“不要为你不用的东西付费”,所以如果你想构建统一的东西,你需要设置一些额外的基础设施来跟踪你需要什么样的删除例程做。

关于c++ - 删除放置或非放置新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46477517/

相关文章:

c - 为什么 free() 只将前 8 个字节设置为零?

c - printf在内存分配中有什么作用吗?

C++ 继承和 valgrind 内存泄漏

c++ - 如何使用智能指针正确销毁 C++ 类

android - 对现有方法的 undefined reference

c++ - 这个奇数程序有什么问题吗?

c - 函数内部重新分配 - 损坏的大小与 prev_size

c++ - 在 C++ 中使用方法而不是类自己的析构函数进行清理的任何理由?

c++ - 奇怪的错误,set<int>::begin() 总是返回 const 迭代器

c++ - 求解数组中的方程