0

私はこのようなクラスを持っています:

#include <iostream>
#include <vector>
using namespace std;

class MyClass
{
    vector<int*> V;

public:
    MyClass();        
    MyClass(int n);
    ~MyClass();
};

MyClass::MyClass()
{             
    return;
}

MyClass::MyClass(int n)
{
    int* T = new int[n];
    for(int i=0; i<n; i++)
    {
        T[i]=i;
        V.push_back(&(T[i]));
    }
    return;
}

MyClass::~MyClass()
{
    for(int i =0; i<V.size(); i++)
        delete V[i];
    return;
}

int main()
{   
    MyClass C(5);
    return 0;
}
  1. 私のデストラクタの何が問題になっていますか?これを実行すると、「*glibcが検出されました* ./a.out:free():無効なポインタ:...」エラーが発生します。
  2. 私はptr_vectorを使うべきだと思いますか?それらについて学ぶ勇気があるかどうかはわかりません。

前もって感謝します!

4

3 に答える 3

3

編集:あなたの意図は配列ではなくポインターのベクトルを持つことなので、問題はコンストラクターにあります:

int* T = new int[n];
for(int i=0; i<n; i++)
{
   T[i]=i;
   V.push_back(&(T[i]));
}

これはポインタを作成しませんnが、sへのポインタを作成しますn int。やったほうがいい:

for(int i=0; i<n; i++)
{
    V.push_back(new int(i));
}

編集前:

問題はデストラクタだけでなく、コンストラクタにもあります。

配列をベクトルにプッシュしたいとします。その場合、次のものが必要です。

MyClass::MyClass(int n)
{
    int* T = new int[n];
    for(int i=0; i<n; i++)
    {
        T[i]=i;
    }
    V.push_back(T);
    return;
}

また、を呼び出すことによって未定義の動作を取得しています

delete V[i];

それ以外の

delete[] V[i];
于 2012-05-03T13:38:00.563 に答える
1

デストラクタでは、割り当てられなかったポインタを削除しています。(または)の特定の一致する使用がある場合にのみdelete(または)を使用でき、ポインターのn-1に対して、そのような呼び出しはありません。delete[]newnew[]int

ベクトルに個々の無関係なへのポインタを保持させたい場合はint、を使用newしてそれぞれを個別に割り当てる必要があります。それらが常にこのような配列に含まれる場合は、その配列へのポインターをメンバーに保持し、デストラクタでその1つのポインターのみを削除します。

于 2012-05-03T13:37:58.690 に答える
1

連続したメモリブロックを

int *T = new int[n];

このブロックの単一の要素を削除することはできません。一度に削除できるのはブロック全体のみです。

于 2012-05-03T13:39:01.483 に答える