Supongamos que tengo la necesidad de hacer lo siguiente (Este es solo un código imaginativo para la discusión del estándar C++, por lo tanto no discutiré por qué lo diseño de esta manera, así que no me moleste con algo como: su diseño es un error.)La misma dirección, varios contadores shared_ptr, ¿está prohibida por el estándar C++?
T* ptr = new T;
shared_ptr<T> p(ptr);
shared_ptr<T> q(ptr, SomeDeleterThatDoesnotDeleteButDoSomeOtherStuff());
Supongamos que la lógica garantiza que p
o algunos de sus copias vive más tiempo que todas las copias de q
, por lo que prácticamente no habrá ningún problema. Mi pregunta es, ¿está prohibido por el estándar de C++, p. explícitamente establecido como UB por C++ estándar, para diferentes contadores shared_ptr para compartir la misma dirección?
Gracias.
¿Qué pasa si 'devuelve q;'? –
@Peter Creo que esa es la idea: invocar a los no delegados y hacer algo útil con el conocimiento de que algún subconjunto de referencias está ahora vacío. – Potatoswatter
El diseño no es * que * terrible para su propósito. Puede garantizar la destrucción adecuada al reemplazar el eliminador personalizado por uno que * lo hace * eliminar, y también posee su propio 'shared_ptr' 1. con un objeto ficticio que realiza la acción en su destructor o 2. tiene otro eliminador personalizado que realiza la acción . Pero esos métodos podrían ser menos eficientes si los conjuntos de objetos 'q' cambian rápidamente en relación con el conjunto de propietarios adecuados' p'. – Potatoswatter