有谁知道一个 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/