[ad_1]
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 覆盖它。
[ad_2]
コメント