13

これが機能しない理由がわかりませんでした。以下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 コードを削除しますcodeptrFunction有効)。

何が原因なのかは後でわかりました。説明をお願いできますか?

4

3 に答える 3

24

これは、~Function();ここでは構文的にデストラクタ呼び出しではないためです。this->~Function();代わりに使用してください。

~Function();演算子として解析され、スタック上にオブジェクトが~作成されます。クラスには があるため、これがコンパイルされます。FunctionFunctionoperator bool

于 2010-12-13T05:41:56.083 に答える
8

明示的なデストラクタ呼び出しを次のように変更します

this->~Function();

現在、 ~Function は「関数」を構築してから ~ ビットごとの演算子を呼び出しており (bool への変換があるため合法です)、呼び出されたオブジェクトではなく、それを破棄しています。

于 2010-12-13T05:44:01.247 に答える
-1

私が思い出したように、デストラクタは明示的に呼び出すことはできません。クリーンアップ コードをデストラクタから他の関数​​に移動して、代わりに呼び出してみてください。

于 2010-12-13T05:30:44.883 に答える