1

宿題のためにバックトラック問題を書いていますが、最後のコードを除いてすべてのコードが機能しdelete[]ます。

/*Assg4.cc*/
int main()
{
    //removed irrelevant code - see pastebin links if needed

    void *data = &datavector;
    bool finished = false;
    bool* continuance = &finished;
    int *a = new int[n+1];
    for(int i=0; i<n; i++)
    {
        a[i] = NULL;
    }

    delete []a;
    delete continuance;

return 0;
}

次のエラーが表示されます。

*** glibc が検出されました *** ./Assg4: free(): 無効なポインター: 0xbfc7098f ***

この関数は、ある時点でbacktrack()配列の内容を埋めるだけであり、配列a[]を削除、拡張、または縮小することはありません。コメントアウトしてもエラーが発生しないため(そしてすべての計算の結果が正しいため)、最後の削除に問題があることはわかっています。私は何を間違っていますか?

Pastebin フル ファイル:

Assg4.cc

backtrack.cc & backtrack.h

4

2 に答える 2

5

エラーが実際にここにあることを確認してください:

delete continuance;

continuanceスタックに割り当てられているを指しているため、スタックに割り当てられているものを削除しようとしてfinishedいます ( への呼び出しなしnew)。スタック上のアイテムは、範囲外になると自動的に破棄されるため、削除について心配する必要はありませんcontinuance

参照:スタックとヒープとは

于 2013-03-30T05:38:47.143 に答える
3
bool finished = false;
bool* continuance = &finished;

delete continuance;

deleteを使用して割り当てられていないポインタを呼び出していますnew。これにより、未定義の動作が発生します。
finished宣言されているスコープが終了すると自動的に破棄される自動/ローカル変数です{ }

ルールは簡単です:

delete電話しない限り、電話しないでくださいnew

于 2013-03-30T05:39:35.300 に答える