-1
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)そのため、メインのコマンドが実行されなくなった後。でテストを行ったのでわかり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);

};

何か案は?

4

1 に答える 1

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

に別のスペースを割り当てていないためint no、削除しないでください。そのためのメモリはtowerオブジェクト自体のメモリに含まれており、towerが解放されると解放されるので、心配する必要はありません。

関数がprint戻ると、2 つのtowerオブジェクトtwoとオブジェクトthreeが破棄され、それらのデストラクタが呼び出されます。割り当てられていないへのポインターを削除しようとするとno、プログラムは未定義の動作を引き起こします。つまり、その時点で何かが起こる可能性があります。幸いなことに、あなたに起こったのはプログラムがクラッシュしたことだけでしたが、もっと悪いことが起こるのを見てきました... http://xkcd.com/292/

また、配列の割り当てやコピーの方法によってはlevels、特に にtower値を渡すときに、デストラクタに他の問題が発生する可能性があることにも注意してくださいprint。代わりにa を使用したほうがよいでしょう。そう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 twoおよびの引数をtower three返しprintます)。

于 2013-07-19T20:21:54.760 に答える