0

次の例でマモリーを解放するにはどうすればよいですか。vt.pop_back()はvtの要素を削除しますが、メモリを解放しません。delete vt [i]が機能せず、セグメンテーション違反が発生します。

#include <vector>
#include <unistd.h>

using namespace std;

const int SIZE = 1000000;

class Test
{
public:
    Test();
    ~Test();    
private:
    int *arr;    
};


int main()
{
    vector<Test *> vt;
    for(int i = 0; i < 100; i++)
        vt.push_back(new Test());
    sleep(10);
    return 0;    
}


Test::Test()
{
    arr = new int[SIZE];
}


Test::~Test()
{
    delete[] arr;
}
4

4 に答える 4

6

「テスト」オブジェクトを格納しているのではなく、これらのオブジェクトへのポインタを格納しています。したがって、deleteはポインタを削除するだけです。

オブジェクトをベクターに格納する場合は、タイプを作成する必要があります

vector<Test>

このようにして、削除呼び出しは実際にオブジェクトのデストラクタを実行します。

結果のコードは次のようになります。

int main() 
{
    vector<Test> vt; 
    for(int i = 0; i < 100; i++) 
        vt.push_back(Test());
    sleep(10);
    return 0;
}

コメントしたように、これには新しいコピーコンストラクタも必要です。

Test::Test(const Test& t)
{
    arr = new int[SIZE];
    for(int i = 0; i != SIZE; i++)
        arr[i] = t.arr[i];
}
于 2012-04-09T10:16:32.857 に答える
4

このように使用できます。オブジェクトdelete vt[i]に割り当てられたメモリが解放されます。Test

for(size_t i = 0; i < vt.size(); ++i)
{
   delete vt[i];
}
vt.clear();
于 2012-04-09T10:17:06.717 に答える
1

オブジェクトではなくポインタを格納しているため、ベクトルを破棄すると「ポインタオブジェクト」が破棄されますが、ポインタが指すオブジェクトは破棄されません。

于 2012-04-09T10:17:24.713 に答える
0

特定の要素を削除したい場合は、の関数eraseを使用してみてくださいstd::vector

于 2012-04-09T10:20:09.053 に答える