我很确定它是正确的,但如果我正确地解释标准(第18.6.1.2节new.delete.array)提到:
空操作符,删除void* ptr,no以外;指针。 。13默认行为:调用运算符删除(Ptr)
由于在默认行为中,delete[]只调用其delete(ptr)等效项,那么为什么要考虑调用哪个版本呢?我尝试用一个示例代码来验证这一点,结果它崩溃了,这使得不匹配的new[]和delete确实导致了糟糕的事情变得更加明显。
#include <iostream>
#include <memory>
class foo{
public:
void bar(){
std::cout << "foo's bar" << std::endl;
}
~foo(){
std::cout << "foo dies after this" << std::endl;
}
};
int main() {
std::shared_ptr<foo> x(new foo[10]);
return 0;
}应如何解释标准中的上述引文?
发布于 2015-05-06 08:56:31
您混淆了delete[]表达式和函数operator delete[]。当你写:
delete[] p;然后编译器发出代码,它将为p指向的数组中的所有对象调用析构函数,然后使用参数p调用去分配函数operator delete[]。根据您引用的文档,默认的::operator delete[]调用::operator delete。因此,在使用默认实现时,以下对解除分配函数的调用是等效的:
::operator delete[] (p);
::operator delete(p);但是,以下是而不是等效的,因为它们所做的不仅仅是调用去分配函数:
delete[] p;
delete p;https://stackoverflow.com/questions/30071603
复制相似问题