вопрос про auto_ptr :: reset - PullRequest
1 голос
/ 17 июля 2010

пожалуйста, кто-нибудь может объяснить этот код с C ++ Ссылочный сайт :

#include <iostream>
#include <memory>
using namespace std;

int main () {
  auto_ptr<int> p;

  p.reset (new int);
  *p=5;
  cout << *p << endl;

  p.reset (new int);
  *p=10;
  cout << *p << endl;

  return 0;
}

Ответы [ 2 ]

5 голосов
/ 17 июля 2010

auto_ptr управляет указателем. reset удалит указатель, который у него есть, и укажет на что-то еще.

Итак, вы начинаете с auto_ptr p, указывая ни на что. Когда вы reset с new int, он ничего не удаляет, а затем указывает на динамически распределенный int. Затем вы назначаете 5 этому int.

Затем вы снова reset, удалив ранее выделенный int, а затем указав на недавно выделенный int. Затем вы назначаете 10 для нового int.

Когда функция возвращается, auto_ptr выходит из области видимости и вызывает ее деструктор, который удаляет последний выделенный int и программа завершается.

2 голосов
/ 18 июля 2010

Может быть, пример будет лучше как:

struct tester {
   int value;
   tester(int value) : value(value) 
   { std::cout << "tester(" << value << ")" << std::endl; }
   ~tester() { std::cout << "~tester(" << value << ")" << std::endl; }
};
int main() {
   std::auto_ptr<tester> p( new tester(1) ); // tester(1)
   std::cout << "..." << std::endl;
   p.reset( new tester(2) );                 // tester(2) followed by ~tester(1)
   std::cout << "..." << std::endl;
}                                         // ~tester(2)

Важная строка, в которой новый указатель передается методу сброса. В выводе вы видите, что вызывается конструктор tester, а затем указатель передается методу reset, автоматический указатель заботится о ранее управляемой памяти и удаляет объект, отображающий ~tester(1) в выводе. Аналогично, в конце функции, когда автоматический указатель выходит за пределы области видимости, он заботится о сохраненной сохраненной указке ~test(2)

...