程序在类成员函数后停止响应?

时间:2013-07-19 20:03:11

标签: c++ class function

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);

};

任何想法?

1 个答案:

答案 0 :(得分:1)

~tower() {
    int *r = &no; delete r; // <- this is wrong
    delete [] levels;
}

您没有为int no分配单独的空间,因此您不应删除它。它的内存包含在tower对象本身的内存中,当tower被释放时它将被释放,你不必担心它。

print函数返回时,两个tower对象twothree将被销毁,并且将调用它们的析构函数。当他们尝试删除指向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返回时,printtower twotower three的论点会发生这种情况。