2016-05-13 108 views
-2

为什么如果我写这样的代码(X是一个通用类)调用构造函数和析构函数双免费()或损坏:C++

int main() 
     { 
     X one(); 
     one.~X(); 
     return 0; 
     } 

给我这个错误?

Double free() or corruption:C++ 
+0

您不需要像那样手动调用析构函数。本地对象在范围末尾自动删除:'{Y background(3000,5000); }'删除'}处的对象。 – kfsone

+0

_ @ Tarlo_x_停止使用原始指针进行阻止。改用标准容器。 –

+2

如果教练要求您使用自动手枪玩俄罗斯轮盘?尽管我应该增加赌注是用指针稍微低一点。 – user4581301

回答

4

你应该几乎从不显式调用析构函数,它们被隐式调用当对象超出范围(或delete d,如果在堆中分配)。首先通过调用background.~Y()手动释放background的数组,然后这个相同的数组尝试在下一个}再次释放。

1

调用对象的析构函数几乎总是错误的。其实我从来没有遇到过这种情况。你需要了解RAII,也许这个例子可以帮助你理解为什么你的错误:

#include <iostream> 

struct Foo{ 
    Foo() { std::cout << " constructor " << std::endl; } 
    ~Foo() { std::cout << " destructor " << std::endl; } 
}; 

int main(){ 
    Foo foo; 
    // foo.~Foo(); // <- never ever do this ! 
}     // <- object is destroyed here ! 

运行这一点,你会看到,析构函数已经被调用。销毁一个已经销毁的对象会导致你得到的错误。