2015-02-04 7 views
-2

할당되지 않은 메모리에서 액세스하는 동안 런타임 오류가없는 이상한 문제가 발견되었습니다.할당 해제 된 메모리에서의 액세스

class Test { 
public: 
    Test(int idx) : c(idx) {} 
    ~Test() { 
    std::cout << "destructor\n"; 
    } 
    void Delay() { 
    Sleep(500); 
    std::cout << "delay " << c << "\n"; 
    } 
protected: 
    int c; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    for (int idx = 0; idx < 100; idx++) { 
    Test* test = new Test(idx); 
    Test*temp = test; 
    delete test; test = NULL; 
    temp->Delay(); 
    } 

    std::cout << "Exit\n"; 

    Sleep(1000); 
    return 0; 
} 

변수 "test"는 할당이 해제되고 임시 메모리 주소는 "test"입니다. 그러나 "temp"와 함께 Delay() 함수를 호출하면 런타임 오류가 발생하지 않습니다. 어떻게 알 수 있습니까?

Delay() 함수에서 IsBadXXXPtr() 함수를 검사하여 메모리 오류가 없음을 확인했습니다.

무엇이 잘못 되었나요?

답변

2

운이 좋지 않아 발생합니다. 잘못된 포인터를 사용하여 정의되지 않은 동작을 호출하고 있습니다. 런타임 오류가 보장되는 것은 아니며 어떠한 보증도하지 않습니다. 그것은 정의되지 않았습니다.

Delay()이 실제로는 멤버 변수에 액세스하지 않기 때문에 실제로 충돌하지 않습니다. 기본적으로 Delay()은 독립형 기능 (클래스 외)으로 작성 될 수도 있습니다.

IsBadReadPtr에 관해서는, 당신이 무슨 말을하고 있는지 보여주기위한 몇 가지 코드를 보여주십시오. 그러나 IsBadReadPtr은 OS 수준 호출이고 newdelete은 언어 구문입니다. newfree을 함께 사용할 수 없듯이 new/deleteIsBadReadPtr 사이의 상호 운용성에 의존 할 수 없습니다.

편집 : 코드에 심각한 문제가 있기 때문에 불행하지만 기회가 없으므로 보이지 않습니다. 앱이 충돌하면 버그가 드러납니다.