2011-03-03 11 views
0

&을 컴파일하고 코드를 붙여 넣었습니다. 놀랍게도 오류없이 작동했습니다. (g ++/linux) 삭제 된 개체는 어떻게 여전히 일부 구성원을 사용할 수 있습니까? 정상적인 행동입니까?삭제 후 C++ 멤버를 사용할 수 있습니까?

#include <iostream> 

using namespace std; 

class chair { 
    public: 
    int height; 
    int x; 
    int y; 

    chair() { 
     before = last; 
     if(last!=NULL) 
      last->after = this; 
     else 
      first = this; 
     last = this; 
     after = NULL; 
    } 

    ~chair() { 
     if(before != NULL) 
      before->after = after; 
     else 
      first = after; 
     if(after != NULL) 
      after->before = before; 
     else 
      last = before; 
    } 

    chair* before; 
    chair* after; 
    static chair* first; 
    static chair* last; 
}; 
chair* chair::first; 
chair* chair::last; 

int main() { 
    chair *room = NULL; 
    int tempx = 0; 
    int tempy = 1; 

    while(tempx<=3) { 

     tempy = 1; 
     while(tempy<=3) { 
      room = new chair(); 
      room->x = tempx; 
      room->y = tempy; 
      tempy++; 
     } 

     tempx++; 
    } 

    room = chair::first; 
    while(room!=NULL) { 
     cout << room->x << "," << room->y << endl; 
     delete room; 
     room = room->after; 
    } 
} 

답변

12

당신이 일을하면 삭제 된 개체에 액세스하는 undefined behavior입니다. 보고있는 데이터는 여전히 사용할 수 있으며 해당 정보가 저장되는 메모리 영역은 아직 무시되지 않지만 그로 인해 발생하는 것을 막는 것은 없습니다.

+4

그것은 당신이 그것을 또는 무료를 삭제하면 포인터를 제로 간단하게하는 것이 좋은 방법입니다. –

+0

@M. Tibbits : 나는 항상 그 일을하는 습관에 동의한다. – GWW

+1

어떤 좋은 메모리 관리자라도 디버그 빌드에서 고유 한 패턴 (예 : 0xdd)으로 해제 된 전체 메모리 블록을 memset하여 포인터 조회가 충돌 할 가능성이 높습니다. – EboMike

2

delete 포인터 변수 자체는 변경되지 않으므로 여전히 이전 메모리 위치를 가리 킵니다.

메모리 위치에 액세스 할 수는 있지만, 거기에 살았던 객체가 삭제 된 후에 거기에서 유용한 것을 발견하면, 얼마나 운이 좋았 느냐에 달려 있습니다. 일반적으로 정의되지 않은 동작입니다.

1

delete를 호출하면 더 이상 메모리 블록이 필요 없다는 것을 프로그램에 알리는 것입니다. 그런 다음 원하는 메모리를 사용할 수 있지만 원하는 경우 메모리를 사용할 필요가 없습니다. 나중에 프로그램에서 해당 메모리 블록을 사용할 수 있으며 계속 액세스하면 가비지 데이터를 가져옵니다.

http://en.wikipedia.org/wiki/Delete_%28C%2B%2B%29

관련 문제