No tenía idea de por qué esto no funciona. El siguiente Function
se crea mediante la colocación nueva. Se proporciona una función que verifica si se debe destruir, y si es así, llama a su destructor de forma manual.Destructor no llamado después de destruir la colocación de objetos -new'ed
Aquí es el caso de prueba en el que parece el destructor nunca es llamado:
/* Represents a function at runtime */
class Function {
public:
/* Creates an invalid function */
Function():codeptr(0) { }
/* Creates a function with the given code pointer */
Function(void *codeptr):codeptr(codeptr) { }
/* Frees the function machine code */
~Function() {
if(*this) {
/* <- I explicitly put a debug output here! */
destroyLLVMCode(codeptr);
}
}
public:
/* Returns true if the function is valid
* (if the code pointer is non-null)
*/
operator bool() const { return codeptr != 0; }
/* Destroy this function by calling its destructor */
void destroy() { ~Function(); }
private:
void *codeptr;
};
He utilizado este como la siguiente. Reduzca el código a continuación al mínimo que todavía muestra el problema. En mi programa real, por supuesto, la memoria se asigna de otra manera, desde un asignador.
#include <new>
#include <cstdlib>
int main() {
void *buffer = std::malloc(sizeof(Function));
Function *f = new (buffer) Function(someExecutableLLVMCode);
/* more code .. register with symbol tables etc.. */
f->destroy();
}
Se puede ver que estoy llamando al destructor en la línea de lectura ~Function()
. El compilador acepta, pero no termina llamándolo: lo verifiqué comprobando si realmente elimina el código LLVM que le di (ponga algún código en el destructor antes de eliminar el código LLVM al que apunta el codeptr
, en caso de que Function
es válido).
Me enteré después de lo que está causando eso. ¿Podría darme una explicación?
Este código nunca crea una función de ninguna manera, y nunca llama a ningún método de función, por lo que no es sorprendente, tampoco destruye ningún objeto Function ... –
@Johannes, ¿cómo se crea la instancia aquí? ¿Dónde está esa colocación 'nueva'? –
@Johannes: toma un descanso, una siesta, lo que sea. ;-) su ejemplo de código no ilustra el problema. Estás diciendo que encontraste la causa pero estás pidiendo una explicación. esto es solo confuso ¿Puedes borrar la pregunta y publicarla mañana? –