如何在向量中释放指针?

How can I deallocate a pointer in vector?

本文关键字:释放 指针 向量      更新时间:2023-10-16

我想擦除向量中的指针,但我也想清空指针内容,以便它不存储A对象并删除指针

#include <iostream>
#include <vector>
class A {
private:
int a;
public:
A(int a): a(a){}
int getValue(){return a;}
};
int main(int argc, char const *argv[]) {
auto a (new A(3));
auto b (new A(4));
A *c = a;
std::cout << "Pointer a: " << a << 'n';
std::cout << "Pointer b: " << b << 'n';
std::cout << "Pointer c: " << c << 'n';
std::vector<A*> v = {a, b};
for (auto i : v)
std::cout << i << " ";
std::cout << 'n';
v.erase(v.begin());
std::cout << "Pointer c: " << c->getValue() << 'n';
for (auto i : v)
std::cout << i << " ";
std::cout << 'n';
return 0;
}

当我在擦除a后打印指针c时,它仍然打印3

听起来你想要的是:

delete v[0];
v[0] = nullptr;

不确定你到底想要什么,但是...使用 C++17,您可以使用智能指针,正如 Rusk 所建议的那样。

这可以轻松解决载体的所有权和删除问题。

在我看来,你需要共享指针(std::shared_ptr(来abv,而c需要一个弱指针(std::weak_ptr(。

因此,当(且仅当(至少有一个维护指针所有权的std::shared_ptr时,您可以使用c

下面是一个没有ab的简化示例,v重命名为vsp(对于"共享指针的向量"(,c重命名为wp(对于"弱指针"(。

#include <iostream>
#include <memory>
#include <vector>
class A 
{
private:
int a;
public:
A (int a0) : a{a0}
{ }
int getValue ()
{return a;}
};
int main ()
{
std::vector<std::shared_ptr<A>> vsp;
vsp.emplace_back( new A{3} );
vsp.emplace_back( new A{4} );
std::weak_ptr<A> wp { vsp.front() };
std::cout << "Pointer 0:  " << vsp[0] << " (" << vsp[0]->getValue() << ')' 
<< std::endl;
std::cout << "Pointer 1:  " << vsp[1] << " (" << vsp[1]->getValue() << ')' 
<< std::endl;
if ( auto sp = wp.lock() )
std::cout << "Pointer wp: " << sp << " (" << sp->getValue() << ')'
<< std::endl;
else
std::cout << "Pointer wp: <deleted>" << std::endl;
vsp.clear();
std::cout << "Vector cleared" << std::endl;
if ( auto sp = wp.lock() )
std::cout << "Pointer wp: " << sp << " (" << sp->getValue() << ')'
<< std::endl;
else
std::cout << "Pointer wp: <deleted>" << std::endl;
}