1. ホーム
  2. c++

[解決済み] ポインターのベクトルを消去する [重複] 。

2022-01-31 20:28:26

質問

このようなクラスを定義したとします。

 class foo {
 private: 
    std::vector< int* > v;
 public:
    ...
    void bar1()
    {
       for (int i = 0; i < 10; i++) {
         int *a = new int;
         v.push_back( a );
       }
    };

    void bar2()
    {
       std::vector< int >::iterator it = v.begin();
       for ( ; it != v.end(); it++ )  
         std::cout << (*it);
       v.clear();
    }
 };

要するに、ベクターにいくつかのポインターをプッシュバックして、後でベクターをクリアしているのです。問題は、このコードにメモリリークがあるかどうかです。つまり、ベクターをクリアすることで、ポインターは適切に削除されるのでしょうか?

解決方法は?

はい、このコードではポインタを削除しない限り、メモリリークが発生します。もし foo クラスがポインターを所有している場合、ポインターを削除するのはそのクラスの責任です。ベクターをクリアする前にこの処理を行わないと、割り当てを解除する必要があるメモリへのハンドルを失ってしまいます。

   for (auto p : v)
   {
     delete p;
   } 
   v.clear();

メモリ管理の問題を完全に回避するために std::vector の適切な スマートポインタ .