Я хочу удалить указатель в векторе, но я также хочу очистить содержимое указателя, чтобы он не хранил объект 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 << '
'
std::cout << "Pointer b: " << b << '
'
std::cout << "Pointer c: " << c << '
'
std::vector<A*> v = {a, b};
for (auto i : v)
std::cout << i << " ";
std::cout << '
'
v.erase(v.begin());
std::cout << "Pointer c: " << c->getValue() << '
'
for (auto i : v)
std::cout << i << " ";
std::cout << '
'
return 0;
}
Когда я печатаю указатель c
после стирания a
, он все еще печатает 3
Всего 2 ответа
Похоже, что вы хотите:
delete v[0];
v[0] = nullptr;
Не уверен, что вы понимаете, чего именно вы хотите, но ... используя C ++ 17, вы можете использовать интеллектуальные указатели, как предложил Раск.
Это может легко решить проблему владения и удаления для вектора.
Мне кажется, что вам нужны общие указатели ( std::shared_ptr
) для a
, b
и v
и слабый указатель ( std::weak_ptr
) для c
.
Таким образом, вы можете использовать c
if (и только если) есть хотя бы std::shared_ptr
которые поддерживают право собственности на указатель.
Ниже приведен упрощенный пример без a
и b
, где 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;
}