c++ boost refcounting

c++ - Por qué shared_ptr tiene un constructor explícito



boost refcounting (5)

En este caso, shared_ptr intentará liberar su pila asignada int. No querrás eso, entonces el constructor explícito está ahí para hacerte pensar sobre eso.

Me preguntaba por qué shared_ptr no tiene un constructor implícito. El hecho de que no se alude aquí: obtener un impulso :: shared_ptr para esto

(Descubrí el motivo pero pensé que sería una pregunta divertida para publicar de todos modos).

#include <boost/shared_ptr.hpp> #include <iostream> using namespace boost; using namespace std; void fun(shared_ptr<int> ptr) { cout << *ptr << endl; } int main() { int foo = 5; fun(&foo); return 0; } /* shared_ptr_test.cpp: In function `int main()'': * shared_ptr_test.cpp:13: conversion from `int*'' to non-scalar type ` * boost::shared_ptr<int>'' requested */


Hace mucho tiempo que lurker, y un estudiante de tercer año de eng suave aquí, Haphazard supondría, para evitar que intentes convertir un puntero "natural" a un shared_ptr, luego desasignar el objeto puntiagudo, sin que shared_ptr sepa sobre el dealloc.

(También, problemas de conteo de referencias, bla, bla).


int main() { int foo = 5; fun(&foo); cout << foo << endl; // ops!! return 0; }


Creo que no hay ninguna razón para tener explícito en este constructor.

Los ejemplos mencionados con uso incorrecto del operador de dirección de desplazamiento (&) no tienen sentido ya que no hay lugar para usar dicho operador en C ++ moderno. Excepto solo el código idiomático en el operador de asignación / comparación como ''this == & other'' y tal vez algún código de prueba.


La razón lógica es que:

  • llamar al operador de delete no está implícito en C ++
  • la creación de cualquier puntero inteligente propietario ( shared_ whatever, scoped_ whatever, ...) es realmente una llamada (demorada) al operador delete