Как я могу освободить указатель в векторе?

Я хочу удалить указатель в векторе, но я также хочу очистить содержимое указателя, чтобы он не хранил объект 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;
 }

Есть идеи?

10000