【解決方法】ポインタを削除するときにベクトル内のポインタをコピーします

[ad_1]

m_vBol.push_back(pbol);

delete pbol;

このコードでは、ベクトルに null ポインターがあり、それが pbol を削除する理由だと思いますが、削除する必要があります。どうすればよいですか?

私が試したこと:

解決しないのでネットで調べてみました

解決策 1

0x01AA が – 非常に正しく – 言ったことに付け加えます…
ポインタをコピーすると、項目のコピーではなく、項目のアドレスのコピーが作成されます。
そして、あなたが電話するとき delete メモリ項目へのポインタでは、使用していたメモリが再利用のためにヒープ プールに返されます。これは、アドレスのコピーがまったく異なる構造を指すことができることを意味します。

たとえば、5 つの整数の配列を malloc し、ポインタをコピーして削除し、その後 100 個の float の配列を malloc した場合、ポインタのコピーが float 配列にアクセスし、他のコードのデータをスクランブルする可能性があります。

ポインタを削除する必要がある場合は、そのポインタがもう使用されていないこと、およびその後アクセスできるポインタのコピーがないことを確認するのはあなたの責任です。そうしないと、無関係なコードで非常に予期しないエラーが発生し始める可能性があります。

解決策 2

次のコード

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

class Foo
{
  int m_value;
public:
  Foo(int i):m_value(i){}
  ~Foo(){ cout << "~Foo() called\n";}
  int get_value(){return m_value;}
};


int main()
{

  Foo * pfoo = new Foo(42);

  vector <Foo * > v;
  v.push_back(pfoo);

  cout << "pfoo " << pfoo << "\n";
  cout << "v[0] " << v[0] << "\n";
  cout << "v[0]->get_value() " << v[0]->get_value() << "\n";

  cout << "deleting pfoo\n";
  delete pfoo;
  cout << "setting pfoo=nullptr\n";
  pfoo = nullptr;

  cout << "pfoo " << pfoo << "\n";
  cout << "v[0] " << v[0] << "\n";
  cout << "v[0]->get_value() " << v[0]->get_value() << "\n";
}

生産された

pfoo 0x55de79f86eb0
v[0] 0x55de79f86eb0
v[0]->get_value() 42
deleting pfoo
~Foo() called
setting pfoo=nullptr
pfoo 0
v[0] 0x55de79f86eb0
v[0]->get_value() 0

私の Linux ボックスでは (さらに悪化する可能性があります)。

見て スマート ポインター – cppreference.com[^]。

[ad_2]

コメント

タイトルとURLをコピーしました