1

Tis = to char
counts_はヒープに格納された整数の配列です ヒープ
values_上の配列の配列です

if ステートメントに問題が発生し、削除しようとするtmpeとエラーが発生します。delete ステートメントをコメントアウトすると、コードは実行されますが、すべてのポインターがvalues_同じ配列を指し続けます。コードの考え方は、選択した配列の 1 つの値を含む新しい配列を作成し、values_それに値を 1 つ追加することです。values_次に、それを元の配列内の場所に再割り当てします。tmpe配列へのポインターを削除しようとするまで、配列は正しい値を保持しています。プログラム全体を実行すると、中止 (コア ダンプ) エラーが発生します。

if (initialized(n) == true)
{   
    T *tmpe = new T[counts_[n] + 1];
    for (size_type i = 0; i < counts_[n]; i++)
    {
        tmpe[i] = values_[n][i];
    }
    tmpe[counts_[n]] = val;
    delete [] values_[n];
    values_[n] = tmpe;
    delete [] tmpe;
    counts_[n]++;
}
else
{
    T *tmpd = new T[counts_[n] + 1];
    tmpd[counts_[n]] = val;
    delete [] values_[n];
    values_[n] = tmpd;
    delete [] tmpd;
    counts_[n]++;
}
4

2 に答える 2

2

問題は、ポインターを保持しているtmpeが、すぐにメモリの割り当てを解除することです。

values_[n] = tmpe;
delete [] tmpe;

次の反復で にアクセスおよび/または削除しようとするとvalues_[n]、それはダングリング ポインターになります。

についても同様ですtmpd

を使えばstd::vector、このような問題を心配する必要はありません。

于 2013-09-23T19:41:15.530 に答える
-1

それを指すようにtmpd再割り当てした後、削除する必要はありません。values_再割り当てするとすぐに、メモリが解放されます。何が起こっているかというと、存在しないものを解放しようとしているということです。

于 2013-09-23T19:41:50.923 に答える