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.

Liberación de memoria asignada dinámicamente en una biblioteca compartida de C++ que causa un error.

Tengo una biblioteca compartida mod.so y tiene una función “getptr” para devolver un puntero a una memoria asignada dinámicamente. También tiene una función “Unload” que libera la memoria que se asignó.
El programa principal carga esta biblioteca compartida en tiempo de ejecución y obtiene el puntero de la función “getptr”, pero cuando se llama a la función “Unload” me da un fallo de segmentación.

#include <iostream>
#include <dlfcn.h>
using namespace std;
int main()
{
  void* module = dlopen("mod.so",RTLD_LAZY);
  typedef int*(*func)();
  typedef void(*func1)();
  func f = (func)dlsym(module,"getptr");
  func1 b = (func1)dlsym(module,"Unload");
  int* p = f();
  b();
}
#include <iostream>
#include <vector>
using namespace std;
vector<int*> allocated;
extern "C"
{
  int* getptr()
  {
    int* p = new int;
    *p = 1024;
    allocated.push_back(p);
    return p;
  }
  void Unload()
  {
    for(auto e: allocated)
      delete e;
  }
}

El archivo mod.cpp se compila de la siguiente manera:

g++ -shared mod.cpp -o mod.so -fPIC</int*></dlfcn.h>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El error de violación de segmento al llamar a la función Unload puede ser causado por varios factores:

    1. Direccionar un puntero nulo o inválido: La función Unload elimina todos los punteros almacenados en el vector asignado. Si alguno de estos punteros es nulo o ya ha sido eliminado, direccionarlos causará una violación de segmento.
    2. Liberar dos veces un puntero: Si el mismo puntero se agrega más de una vez al vector asignado o si se elimina manualmente antes de llamar a la función Unload, eliminarlo nuevamente en Unload causará una violación de segmento.

    3. Condiciones de carrera al acceder al vector asignado: Si varios hilos o procesos acceden al vector asignado simultáneamente, podría provocar una violación de segmento al eliminar punteros en la función Unload.

    Para depurar el problema, podemos utilizar un depurador como gdb para determinar la ubicación exacta donde ocurre la violación de segmento. Podemos agregar puntos de interrupción en la función Unload y avanzar paso a paso a través del código para ver qué puntero está causando el problema. También podemos imprimir el contenido del vector asignado para verificar si alguno de los punteros es inválido o ha sido eliminado. Otra opción sería utilizar un perfilador de memoria como Valgrind para detectar fugas de memoria o accesos inválidos en el programa.

Comments are closed.