在销毁对象放置后没有调用析构函数 - new'ed

时间:2010-12-13 05:10:07

标签: c++ destructor placement-new

我不知道为什么这不起作用。以下Function由新展示位置创建。提供了一个函数,用于检查是否应该销毁它,如果是,则手动调用其析构函数。

这是测试用例,似乎从不调用析构函数:

/* 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代码来验证它(在删除codeptr指向的LLVM代码之前将一些代码放入析构函数中,如果Function有效)。

我后来发现了导致这种情况的原因。你能帮我解释一下吗?

3 个答案:

答案 0 :(得分:24)

这是因为~Function();在这里没有语法上的析构函数调用。请改用this->~Function();

~Function();被解析为运算符~并在堆栈上创建Function对象。 Function类有一个operator bool,这就是编译它的原因。

答案 1 :(得分:8)

将显式析构函数调用更改为

this->~Function();

目前〜函数正在构造一个“函数”,然后调用〜按位运算符,(合法的,因为你转换为bool),然后破坏它,而不是被调用的对象。

答案 2 :(得分:-1)

我记得析构函数不能被明确地调用。尝试将清理代码从析构函数移动到其他函数并改为调用它。