[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 ボックスでは (さらに悪化する可能性があります)。
[ad_2]
コメント