El popular uso generalizado de shared_ptr casi inevitablemente causará una ocupación de memoria no deseada e invisible.
Las referencias cíclicas son una causa bien conocida y algunas de ellas pueden ser indirectas y difíciles de detectar, especialmente en código complejo en el que trabaja más de un programador; un programador puede decidir que un objeto necesita una referencia a otro como una solución rápida y no tiene tiempo para examinar todo el código para ver si está cerrando un ciclo. Este peligro está muy subestimado.
Menos conocido es el problema de las referencias inéditas. Si un objeto se comparte en muchos shared_ptrs, no se destruirá hasta que cada uno de ellos se ponga a cero o salga del alcance. Es muy fácil pasar por alto una de estas referencias y terminar con objetos ocultos en la memoria que usted pensó que había terminado.
Aunque estrictamente hablando, estas no son pérdidas de memoria (todo se lanzará antes de que el programa salga) son igual de dañinas y más difíciles de detectar.
Estos problemas son consecuencia de declaraciones falsas oportunas: 1. Declarando lo que realmente quiere ser propiedad única como shared_ptr. scoped_ptr sería correcto, pero luego cualquier otra referencia a ese objeto tendrá que ser un puntero sin formato, que podría dejarse colgando. 2. Declarando lo que realmente quiere que sea una referencia de observación pasiva como shared_ptr. weak_ptr sería correcto, pero tienes la molestia de convertirlo a share_ptr cada vez que quieras usarlo.
Sospecho que su proyecto es un buen ejemplo del tipo de problemas en los que puede incurrir esta práctica.
Si tiene una aplicación con uso intensivo de memoria, realmente necesita una sola propiedad para que su diseño pueda controlar explícitamente la duración de los objetos.
Con propiedad única opObject = NULL; definitivamente eliminará el objeto y lo hará ahora.
Con propiedad compartida spObject = NULL; ........ ¿quién sabe? ......
¡Muchas gracias! Hay alrededor de 200 mil líneas. Por lo tanto, es difícil comprobar cada nuevo ... ¿hay alguna macro de compilación para activar la capacidad de verificación de ref de boost (si tal habilidad existe). La memoria está causando al programar error de lógica sobre pools, estoy seguro, pero simplemente no puedo encontrarlo. – user25749
Aún puede tener pérdidas de memoria con shared_ptrs. Cree una referencia cíclica, y nunca se eliminará, incluso si el resto de la aplicación ya no hace referencia a ella. Fuga de memoria instantánea! – jalf
Una referencia a un objeto retenido incorrectamente sigue siendo una pérdida de recursos. Esta es la razón por la cual los programas de GC aún pueden tener pérdidas, generalmente debido al patrón Observador: el observador se encuentra en una lista en lugar de ser observable y nunca se le quita. En definitiva, se necesita un 'eliminar' para cada 'agregar', al igual que se necesita 'eliminar' para cada 'nuevo'. Exactamente el mismo error de programación, causando exactamente el mismo problema. Un "recurso" es realmente solo un par de funciones que deben llamarse el mismo número de veces con los argumentos correspondientes, y una "fuga de recursos" es lo que sucede cuando no se puede hacer eso. –