我确实怀疑使用delete p
。在大多数情况下,我们在析构函数中调用delete,如果我们调用了int *p = new int (10);
,但是根据下面的代码片段(delete p的原始代码),它已经调用析构函数然后调用operator delete然后我们应该调用它们在析构函数中删除p。
原始代码:
delete a;
if (a != NULL) {
a->~A();
operator delete(a);
}
我们称之为删除内部析构函数的代码片段
class B
{
int *a;
public:
B()
{
a=new int(90);
}
~B()
{
cout<<"B's destructor";
delete a;
}
void dial()
{
cout<<"dial the tone";
}
}
答案 0 :(得分:1)
不要那样做!这是双重破坏和双重免费
delete a; // calls destructor and then frees the memory
if (a != NULL) {
a->~A(); // calls destructor again
operator delete(a); // frees memory again
}
这个没问题,因为你在构造函数中分配了内存
~B()
{
cout<<"B's destructor";
delete a;
}
使用c++11,您可以使用std::unique_ptr
代替
class B
{
std::unique_ptr<int> a;
public:
B() : a(new int(90));
{
}
~B()
{
cout<<"B's destructor";
// std::unique_ptr will take care of memory
// no delete a neccessary
}
...
};
答案 1 :(得分:0)
功能operator delete
和delete expression
不相同。默认的operator delete
只释放内存,但表达式在释放内存之前调用析构函数。阅读http://en.cppreference.com/w/cpp/language/delete
delete a;
if (a != NULL) {
a->~A();
operator delete(a);
}
非常非常奇怪的片段。这里有UB。
答案 2 :(得分:0)
在新动态分配内存的所有地方,我们需要使用 operator delete 来释放内存。请检查下面提到的链接中的说明。 http://en.cppreference.com/w/cpp/memory/new/operator_delete