当我删除指针时复制向量中的指针


m_vBol.push_back(pbol);

delete pbol;

使用这段代码,我的向量有空指针,我认为这就是我删除 pbol 的原因,但我必须删除它,我该怎么办?

我尝试过的:

我试图在网上搜索,因为我没有解决它

解决方案1

只是补充一下 0x01AA 所说的 – 非常正确 – ……
复制指针就是这样做的——它复制一个项目的地址,而不是该项目的副本。
当你打电话时 delete 在指向内存项的指针上,它所使用的内存将返回到堆池以供重用 – 这意味着该地址的任何副本现在都可以指向完全不同的结构。

例如,如果您 malloc 一个包含 5 个整数的数组,复制指针,删除它,然后 malloc 一个包含 100 个浮点数的数组,则指针的副本可以访问浮点数组并打乱其他代码的数据。

如果您需要删除一个指针,您有责任确保它不再使用,并且没有可以随后访问的指针副本 – 否则在不相关的代码中可能会开始出现严重不可预测的错误!

解决方案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[^]。

解决方案3

除了 Palini 的解决方案(将指针封装在类中或使用智能指针)之外,还可以在删除向量之前简单地从向量中删除无效指针。 那么就不会再出现任何问题了。

C++
m_vBol.erase(std::find(m_vBol.begin(), m_vBol.end(), pbol));
// or m_vBol.erase(std::remove(std::begin(m_vBol), std::end(m_vBol), pbol), std::end(m_vBol));
delete pbol;

或者,您可以使用 nullptr 覆盖它。

コメント

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