2010-12-13 3 views
13

이것이 작동하지 않는 이유는 없습니다. 다음은 새로운 게재 위치로 생성 된 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 코드를 삭제하기 전에 소멸자에 코드를 넣으십시오.이 코드는 codeptrFunction이 유효 함).

그 원인을 나중에 알았습니다. 설명해 주시겠습니까?

+0

이 코드는 어떤 식으로도 함수를 생성하지 않으며 Function의 모든 메서드를 호출하지 않으므로 suprising이 아니라면 함수 개체를 파괴하지 않습니다. –

+0

@Johannes, 여기에 인스턴스를 어떻게 작성합니까? 그 배치가 '새로운 것'은 어디에 있습니까? –

+0

@Johannes : 잠깐, 낮잠 자. ;-) 코드 예제는 문제를 설명하지 않습니다. 당신은 그 원인을 발견했다고 말하고 있지만 당신은 설명을 요구하고 있습니다. 이것은 단지 혼란 스럽다. 내일 질문을 삭제하고 게시 할 수 있습니까? –

답변

24

이것은 소멸자가 아니고 ~Function();이 여기에서 구문 적으로 호출하기 때문입니다. 대신 this->~Function();을 사용하십시오.

~Function();은 연산자 ~으로 구문 분석되고 스택에 Function 개체가 생성됩니다. Function 클래스는 operator bool이므로 컴파일됩니다.

+6

하지만 그렇지 않다면,'Function :: ~ Function()'라고 써야한다면,'~ Function()'은 무엇으로 해석 될까요? 임시'Function' 객체에 비트 단위 부정을 적용합니까? 컴파일되지 않아야한다고 생각합니다. OH 업데이트 : 그는'bool'으로 암시 적 변환을합니다. 그럴 수 없다! –

+0

'Function :: ~ Function()'도 작동하지 않습니다. Standard는'ptr-> ~ Function()'을 써야한다고 말한다. –

+0

음, Function :: ~ Function()은 정상적으로 작동합니다. 하지만 당신은'~ Function()'에 대해 옳았다. 거룩한 C++ 표준의 5.3.1/9에 설명되어 있습니다. –

-1

소멸자를 명시 적으로 호출 할 수 없다는 것을 기억합니다. 소멸자에서 다른 함수로 정리 코드를 이동하고 대신 호출 해보십시오.

+0

소멸자를 명시 적으로 호출 할 수있다. (생성자 호출을위한 구문이 전혀 없기 때문에 명시 적 생성자 호출을 논하기가 더 어렵다. 의미 론적 수준이지만 소멸자 호출 그 전문 용어 문제도 없다 : 모든 것이 아주 분명하다.) –

+0

다음과 같이 소멸자를 만 호출 할 수 있습니다. Obj o; o. ~ Obj(); "mayBeDestroy"메소드에서 수행되는 방식이 맘에 들지 않습니다. 컴파일 오류가 발생 했어야합니다. 그렇지 않으면 Function :: ~ Function(); – Arunmu

+0

고마워요, 지금 보입니다. – ruslik

8
는 현재 ~ 기능은 "기능"을 건설하고 후 ~ 비트 연산자를 호출, (법적는 bool에있는 변환을 가지고 있기 때문에), 다음 것을 파괴한다

this->~Function(); 

에 명시 적 소멸자 호출을 변경

호출 된 객체가 아닙니다.

관련 문제