이것이 작동하지 않는 이유는 없습니다. 다음은 새로운 게재 위치로 생성 된 Function
입니다. 소멸되어야하는지 여부를 검사하는 기능이 제공되며, 소멸 될 경우 소멸자를 수동으로 호출합니다.오브젝트 배치를 파기 한 후에 소멸자가 호출되지 않았습니다.-new'ed
/* 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
이 유효 함).
그 원인을 나중에 알았습니다. 설명해 주시겠습니까?
이 코드는 어떤 식으로도 함수를 생성하지 않으며 Function의 모든 메서드를 호출하지 않으므로 suprising이 아니라면 함수 개체를 파괴하지 않습니다. –
@Johannes, 여기에 인스턴스를 어떻게 작성합니까? 그 배치가 '새로운 것'은 어디에 있습니까? –
@Johannes : 잠깐, 낮잠 자. ;-) 코드 예제는 문제를 설명하지 않습니다. 당신은 그 원인을 발견했다고 말하고 있지만 당신은 설명을 요구하고 있습니다. 이것은 단지 혼란 스럽다. 내일 질문을 삭제하고 게시 할 수 있습니까? –