He buscado una respuesta a esto pero no puedo encontrar una. (Tengo una experiencia bastante limitada con C++)Comprobación para ver si se puede liberar un puntero
En mi biblioteca, libero una cadena. (Increíble, ¿eh?)
Aquí es donde surge el problema. Tengo una estructura que contiene un char * que puede asignarse en el montón o no. Si bien es un puntero válido, no se puede liberar.
IE
char* s1 = "A String";
char* s2 = (char*)memcpy(malloc(9), s1, 9);
free(s2);
free(s1);
causará un error en el "libre (S1);" (Como debería) Dado que s1 en realidad no necesita para liberarse, (No está en el montón) ¿cómo puedo manejar esto de una manera "aceptable"? (En temas similares, la respuesta de "déjalo colapsar" no parecía razonable IMO)
Dado que la estructura no es únicamente creada por la biblioteca, no es posible garantizar que una cadena se copiará correctamente utilizando algo como memcpy.
Como esta es una biblioteca de Windows, no tengo que preocuparme por usar material ISO C o funciones C estándar.
Mejor respuesta (en mi humilde opinión): Utilice un puntero opaco para garantizar que el 'struct' _es_ exclusivamente creado en la biblioteca. (Ofrecería más ayuda si usé Windows. Lo siento +1). –
Gracias, si lo peor llega a ser peor, puedo hacerlo o usar SEH (aunque esto último me haría sentir que estaba haciendo algo mal) – James
Al ver que se trata de una biblioteca de Windows, convierte el argumento en un BSTR. Luego requiere que el usuario lo asigne correctamente (con 'SysAllocString') y se garantiza que usará un separador correspondiente. Otros métodos son simplemente ... malos. Si su usuario tiene un compilador diferente, entonces no puede 'libre()' la cadena incluso si utilizaron 'malloc' –