Как я могу освободить указатель в векторе? - PullRequest
0 голосов
/ 20 октября 2018

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

Когда я печатаю указатель c после стирания a он все равно печатает 3

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Не уверен, что понимаю, чего именно вы хотите, но ... используя C ++ 17, вы можете использовать умные указатели, как предлагает Раск.

Это может легко решить проблему владения и удаления дляvector.

Мне кажется, вам нужны общие указатели (std::shared_ptr) для a, b и v и слабый указатель (std::weak_ptr) для c.

Таким образом, вы можете использовать c, если (и только если) существует хотя бы 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;
 }
0 голосов
/ 20 октября 2018

Звучит так, как вы хотите:

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