2013-05-29 2 views
0

무효 포인터를 자유롭게. 오류 운영자가 삭제 ', * 인수가 정의되지 않은 한 한 동작을 무효로 적용하고, 가장 가능성이 개체의 소멸자를 호출하지 않는보기무효 포인터를 해제하는 방법

struct vStruct { 
    void *vPtr; 
    struct vStruct *next; 
}; 

struct vStruct sObj; 
struct vStruct *sObjNew = sObj; 

delete sObjNew->vPtr; -----------> Is this correct way to delete void pointer 
delete sObjNew; 

.

+0

, 그것은이 사이트에 추가 방문자에게 도움이 될 것 같은 것을, 그것을 표시하는 것을 잊지 마십시오. – Spook

답변

3

당신은 void 포인터를 삭제하지 않아야합니다. delete은 특정 유형 (예 : 컴파일러가 알 수있는 것, 오류 메시지에 설명 된대로 소멸자를 호출해야 함)에서 작동합니다.

당신이 당신의 구조에 지정되지 않은 유형을 유지하려면

, 당신은 어떻게 든 포장해야합니다.

class DataWrapper 
{ 
public: 
    virtual void * GetData() = 0;    
    virtual ~DataWrapper() 
    { 
    } 
}; 

class MyDataWrapper 
{ 
protected: 
    MyData * data; 

public: 
    MyDataWrapper(MyData * newData) 
    { 
     data = newData; 
    } 

    void * GetData() 
    { 
     return data; 
    } 

    ~MyDataWrapper() 
    { 
     delete data; 
    } 
}; 

struct vStruct 
{ 
    MyDataWrapper * vPtr; 
    struct vStruct *next; 

    ~vStruct() 
    { 
     if (vPtr != null) 
      delete vPtr; 
    } 
}; 

vStruct sObj; 
sObj.vPtr = new MyDataWrapper(new MyData()); 

// When sObj gets deleted, MyDataWrapper is 
// deleted too (thanks to the ~vStruct) and 
// in effect, the allocated data is deleted too. 

주, 그것은 간단한 예제 것으로,보다 심미적으로 쓸 수 있습니다. 답변 중 하나가 문제가 해결 될 경우 승인으로

9

당신은하지 delete 무효 포인터를 않습니다. 왜? 때문에 :

동작을 보증되지 void* 인수에 적용, '삭제', 가장 가능성이 개체의 소멸자를 호출하지 않습니다.

어떻게 컴파일러는 pointee 객체가이 유형을 알아? 따라서 어떤 소멸자가 부름을 받았습니까? (아마 할당 메커니즘에 따라 무료로 얼마나 많은 메모리를 확인할 수 있지만.)

void* — 대신 "진짜"포인터 타입을 사용 보관하지 마십시오. 당신이 진정한 타입 "숨길"해야하는 경우, 구식 C 관행 대신 다형성을 사용하는 것이 좋습니다.

3

어떻게 vPtr이 초기화되었다?

  • 구조체가 소유하지 않은 데이터를 가리키는 경우이를 파괴하면 안됩니다. 이 malloc 사용하여 생성 된 데이터를 가리키는 경우
  • , 당신은 free를 호출해야합니다.
  • new 사용하여 생성 된 데이터를 가리키는 경우 올바른 소멸자를 호출 할 수 있도록 delete를 호출하기 전에 입력 올바른 (또는 호환)에 캐스팅해야 할 것입니다.

예제 코드는 컴파일되지 않지만 vPtr이 전혀 초기화되지 않았 음을 참고하십시오. 모든 vStruct 인스턴스에서 vPtr을 초기화해야합니다. 초기화되지 않은 vPtr을 해제하려고하면 정의되지 않은 결과가 발생하지만 충돌 할 수 있습니다.