Я понятия не имел, почему это не работает. Следующий Function
создается путем размещения new. Предоставляется функция, которая проверяет, следует ли ее уничтожить, и, если да, вызывает ее деструктор вручную.
Вот тестовый пример, где кажется, что деструктор никогда не вызывается:
/* 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;
};
Я использовал это следующим образом. Сократите приведенный ниже код до минимума, который все еще демонстрирует проблему. В моей реальной программе, конечно, память распределяется другим способом, из распределителя.
#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();
}
Вы можете видеть, что я вызываю деструктор в строке, читающей ~Function()
. Компилятор принимает, но не вызывает его: я проверил его, проверив, действительно ли он удаляет предоставленный мной код LLVM (поместите некоторый код в деструктор перед удалением кода LLVM, на который указывает codeptr
, в случае, если Function
действительно).
Позже я узнал, что вызывает это. Не могли бы вы дать мне объяснение?
new
? - person Nikolai Fetissov   schedule 13.12.2010bool
функциями преобразования. - person James McNellis   schedule 13.12.2010