3

メモリ内のポインターのベクトルと指定されたオブジェクトを削除する方法を理解しようとしています。別のスレッドで見つかった簡単な例から始めましたが、「解放されているポインターが割り当てられていません」というエラーが発生します。

私が間違っていることは何ですか?

#include <vector>
#include <algorithm>
#include <iostream>

int main(){
    std::vector <int *> vec;

    int a = 2;
    int * b = &a;

    int c = 3;
    int * d  = &c;

    vec.push_back(b);
    vec.push_back(d);

    for (int i = 0; i < vec.size(); i++) {
        delete vec[i];
    }
    vec.clear();

}
4

3 に答える 3

3

new で作成された変数に対してのみ削除を呼び出します。このリンクを確認してください: スタックに割り当てられた変数で削除を呼び出す

于 2013-07-07T22:33:30.987 に答える
2

自動ストレージでスタックに割り当てられたメモリの割り当てを解除しています。そのため、エラーが発生しています。

deleteで割り当てたもののみnew。あとはRAIIがやってくれます。

于 2013-07-07T22:33:42.053 に答える
0

あなたがするとき

int a = 2;

スタックに int を割り当てていますが、スタック上のものは必要ありませんdelete。宣言されているスコープを離れると、自動的に解放されます。したがって、コードでは、同じものを 2 回解放しようとしています。

あなたがするなら

int* a = new int(2);

次に、ヒープに int を割り当てます。明示的に を呼び出さない限り、データは削除されませんdelete

肝心なのは、new常にdeleteペアで書かれるべきです。

于 2013-07-07T22:43:42.507 に答える