es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Existe alguna manera de utilizar el montón de módulos principal desde una DDL o, de no ser posible, eliminar de manera segura las asignaciones realizadas en una DDL desde el módulo principal (aplicación)?

Tengo una clase en el módulo principal que sostiene una lista de cosas. Me gustaría agregar algunas cosas a esa lista en un dll. Los elementos en la lista pueden ser agregados y eliminados (asignados/liberados) arbitrariamente.

Mi comprensión es que es mala práctica eliminar los datos asignados en un módulo desde otro. ¿Puedo de alguna manera asignar datos usando el heap del módulo principal desde un dll? Si no, ¿hay alguna manera segura de eliminar datos asignados en un dll desde el módulo principal?

Idealmente, una solución funcionaría tanto en Linux como en Windows. Aquí hay un ejemplo (que funciona) en Windows.

Tenga en cuenta que en Main.cpp estoy eliminando una asignación hecha en el dll DynamicModule y Windows no arroja ninguna excepción. Esperaba una, pensando que el módulo principal no debería poder eliminar una asignación realizada en el heap del dll.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Sí, generalmente se considera una mala práctica eliminar datos asignados en un módulo desde otro. Sin embargo, es posible asignar datos utilizando el montón del módulo principal desde una DLL. En Windows, esto se puede lograr utilizando la función HeapAlloc, que le permite especificar el identificador del montón que se va a utilizar.

    Alternativamente, podría considerar transferir la propiedad de la memoria asignada al módulo principal utilizando algún tipo de mecanismo de transferencia de propiedad. Por ejemplo, podría definir una función en el módulo principal que tome posesión de una pieza de memoria asignada en la DLL y sea responsable de liberarla cuando ya no sea necesaria.

    Para eliminar datos asignados en una DLL desde el módulo principal, simplemente puede llamar a la función de liberación de memoria correspondiente dentro de la DLL. Esto se debe a que la memoria asignada en una DLL generalmente se asigna desde el montón del proceso, que se comparte entre todos los módulos dentro del proceso.

    En cuanto a una solución multiplataforma, podría considerar utilizar una biblioteca de gestión de memoria multiplataforma como Boost.Heap o tcmalloc, que proporcionan implementaciones portátiles de asignación y liberación de memoria de montón.

Comments are closed.