これが機能しない理由がわかりませんでした。以下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();
}
行 reading でデストラクタを呼び出していることがわかります~Function()
。コンパイラは受け入れますが、それを呼び出すことはありません: 私は、指定した LLVM コードを実際に削除するかどうかを確認して検証しました (デストラクタにコードを入れてから、 が指す LLVM コードを削除しますcodeptr
。Function
有効)。
何が原因なのかは後でわかりました。説明をお願いできますか?