1

動的配列を実装しようとしていますが、これが容量を増やすための関数です

int* changeCapacity(int *arr, int length, int newCapacity) {
    int *newArr = new int[newCapacity];

    if(length > newCapacity){
        return 0;
    } else {
        for(int i = 0; i < length; i++){
            newArr[i] = arr[i];
        }
        delete[] arr;
        arr = newArr;
        return arr;
    }
}

これは私が得るエラーです:

speicher(2465,0x7fff7cfc2310) malloc: * オブジェクト 0x7f9742403910 のエラー: 解放されるポインターが割り当てられませんでした *デバッグするために malloc_error_break にブレークポイントを設定します

私はこのように呼んでいます:

int* addElement(int *arr, int& length, int& capacity, int val){
if(length >= capacity){
    capacity = capacity * 2;
    changeCapacity(arr, length, capacity);

    arr[length] = val;
    length += 1;
    return arr;
}else{

    arr[length] = val;
    length += 1;
    return arr;
}

}

4

4 に答える 4

0

これは、エラー メッセージに基づいた推測ですが、次のことを示しています。

int* addElement(int *arr, int& length, int& capacity, int val)
{ //...
  changeCapacity(arr, length, capacity);
  //...
}

これは次を呼び出します:

int* changeCapacity(int *arr, int length, int newCapacity)
{ //...
  delete[] arr;
  //...
}

arrただし、これまでに投稿したコードを考えると、への引数の元のソースaddElement()は不明です。あなたは偶然にこのようなことをしていますか:

foo()
{ int array[N];
  //...
  addElement(array, ...);
  //...
}

それともaddElement()、グローバル配列変数で呼び出しますか? new[]どちらの場合でも、元の配列は を介し​​てに一致するように割り当てられませんdelete[]。これは、ランタイム ライブラリが不平を言っているように見えます。エラー メッセージに示されているポインターの値は、最初にスタックに割り当てられたと思わせる傾向があります。

もちろん、changeCapacity()and/orの戻り値をキャプチャしないなどの他の問題や、NULL ポインターを返すaddElement()可能性changeCapacity()も引き続き有効であり、修正する必要があります。

于 2014-06-19T19:25:54.707 に答える
0

現在arr、参照によってポインターを渡す必要がある のアドレスを変更しています。これを行う:

int* changeCapacity(int *&arr, int length, int newCapacity)
于 2014-06-19T15:27:52.153 に答える