четверг, 23 февраля 2012 г.

Иллюстрации к посту о неглупых указателях
































P.S.

Правильный вариант:




#include <iostream>
#include <boost/scoped_ptr.hpp>
#include <boost/intrusive_ptr.hpp>

class A{
public:
  A(){ std::cout << "Взяли кота" << std::endl; }
  ~A(){  std::cout << "Отдали кота" << std::endl; }
};

void f(){
  A* ptr = new A;
  delete ptr;
}

int main(){
  f();
  return 0;
}

Правильный вариант с умным указателем:

void f(){
   boost::scoped_ptr<A> ptr(new A);
   // boost::shared_ptr<A> ptr(new A);
   // boost::intrusive_ptr<A> ptr(new A);
}
А для boost::intrusive_ptr придется определить ещё функции подсчета ссылок и освобождения памяти:

namespace boost{
  template<class T>
  void intrusive_ptr_add_ref(T * p){
    std::cout << "Реализуем счетчик ссылок ++" << std::endl;
  }
  template<class T>
  void intrusive_ptr_release(T * p){
    std::cout << "Освобождение памяти:" << std::endl;
    delete p;
  }
}
А вот так делать не надо:

void f(){
   A* ptr = new A;
} 
 
P.S. Вдохновлялась "Книгой о Хаусе".

Комментариев нет: