为什么如果我写这样的代码(X是一个通用类)调用构造函数和析构函数双免费()或损坏:C++
int main()
{
X one();
one.~X();
return 0;
}
给我这个错误?
Double free() or corruption:C++
为什么如果我写这样的代码(X是一个通用类)调用构造函数和析构函数双免费()或损坏:C++
int main()
{
X one();
one.~X();
return 0;
}
给我这个错误?
Double free() or corruption:C++
你应该几乎从不显式调用析构函数,它们被隐式调用当对象超出范围(或delete
d,如果在堆中分配)。首先通过调用background.~Y()
手动释放background
的数组,然后这个相同的数组尝试在下一个}
再次释放。
调用对象的析构函数几乎总是错误的。其实我从来没有遇到过这种情况。你需要了解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 !
运行这一点,你会看到,析构函数已经被调用。销毁一个已经销毁的对象会导致你得到的错误。
您不需要像那样手动调用析构函数。本地对象在范围末尾自动删除:'{Y background(3000,5000); }'删除'}处的对象。 – kfsone
_ @ Tarlo_x_停止使用原始指针进行阻止。改用标准容器。 –
如果教练要求您使用自动手枪玩俄罗斯轮盘?尽管我应该增加赌注是用指针稍微低一点。 – user4581301