int main() {
one.print(two, three);
cout << "HERE" << endl;
calculate(3, 1, 2, 3);
one.~tower();
two.~tower();
three.~tower();
system("PAUSE");
return 0;
}
各位大家好。我正在制作一个程序(用c ++编写),打印出河内拼图塔的解决方案。所以我有一个名为print的函数,它工作得很好,但是由于某些原因它之后不会返回main()。
所以在one.print(two, three)
之后没有执行main中的其他命令。我知道因为我用cout
进行了测试。但是,函数中的所有命令都可以完美执行。这是功能。
void tower::print(tower two, tower three) {
for(int i = 0; i < no; i++) {
checkandprint(levels[i], no);
checkandprint(two.levels[i], no);
checkandprint(three.levels[i], no);
cout << endl;
}
for(int i = 0; i < 3; i++) {
bottoms(no);
}
cout << "Press enter to continue...";
cin.get();
cout << "here (end of function)" << endl;
}
以下是tower
类中该函数的原型:
class tower {
public:
int no;
int *levels;
tower(int init, bool source);
~tower() {int *r = &no; delete r; delete [] levels;}
void print(tower two, tower three); //this one!
void bottoms(int rows);
void assign(int n);
void move(int dest);
};
任何想法?
答案 0 :(得分:1)
~tower() {
int *r = &no; delete r; // <- this is wrong
delete [] levels;
}
您没有为int no
分配单独的空间,因此您不应删除它。它的内存包含在tower
对象本身的内存中,当tower
被释放时它将被释放,你不必担心它。
当print
函数返回时,两个tower
对象two
和three
将被销毁,并且将调用它们的析构函数。当他们尝试删除指向no
的指针时,他们没有分配,你的程序会产生未定义的行为,这意味着任何事情都可能发生在那一点上。幸运的是,发生在你身上的一切都是程序崩溃,但我看到更糟糕的事情发生了...... http://xkcd.com/292/
另请注意,析构函数可能还有其他问题,具体取决于您分配和/或复制levels
数组的方式,特别是在将tower
按值传递给{{1}时}。您最好使用print
,然后您不必担心分配或删除它。
哦,是的,就像评论中提到的人一样,你不这样做:
std::vector<int> levels
当对象被销毁时,程序会调用析构函数:当你明确地one.~tower(); // bad, very very bad and wrong,
// just wrong, bad and wrong, and awful, just...
// just don't do it, ok?
一个你自己分配的对象,或者一个对象的生命周期结束时,就像一个函数返回时和所有本地对象一样被销毁(当delete
返回时,print
,tower two
和tower three
的论点会发生这种情况。