2012-11-20 4 views
1

SDL로 게임을 만들고 SDL_VideoInfo를 사용하여 현재 해상도를 모니터합니다.SDL_VideoInfo 포인터를 삭제할 때 디버그 어설 션이 실패했습니다.

예제 코드 : (이것은 몇 가지 철자 오류 또는 함수/변수 유형에 대한 잘못된 이름 일 수 있습니다.

#include <SDL.h> 
#include <iostream> 
using namespace std; 

int main() 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 
    const SDL_VideoInfo *vInfo = SDL_GetVideoInfo(); 
    cout << "Moniter Resolution:\n"; 
    cout << vInfo->current_w << endl << vInfo->current_h << endl; 
    delete vInfo; 
    return 0;   
} 

내가 이것을 실행하는 처음 몇 번, 잘 작동, 나는 디버그 어설 나 팝업 창을 실패 얻을. 그게 무슨 뜻인지는 모르겠지만 메모리 누수와 관련이 있다고 생각합니까? 저는 Java에서 왔기 때문에 메모리 누수와 포인터 등은 모두 새로운 것입니다. 그래서 저는 다소 혼란 스럽습니다.

어쨌든, vInfo를 삭제하지 않아도 코드가 제대로 작동하지만, 내가 본 모든 C++ 책과 비디오가 끝나면 포인터를 삭제하지 않는 것이 신성 모독이라는 메시지를 보냅니다. 그래서 (분명히) vInfo를 삭제하는 것이 나의 유일한 선택입니다. 메모리에서이 일을, (다시 한번 맞춤법 실수가있을 수 있습니다 :

그래서, 나는 는 내가이 디버그 어설 메시지가 실패하지 않는 수행 할 때 적어도,이 일을하여 고정 또는 생각, 생각 또는 오류가 발생할 수있는 오타가 있지만 그 점을 파악해야합니다.

int main() 
{ 
    SDL_Init(SDL_INIT_EVERYTHING); 
    auto_ptr<const SDL_VideoInfo> vInfo(SDL_GetVideoInfo()); 
    cout << "Moniter Resolution:\n"; 
    cout << vInfo->current_w << endl << vInfo->current_h << endl; 
    vInfo.release(); 
    return 0;   
} 

자동 포인터에 넣으면 모두 작동합니다. 이것이 문제를 해결할 지 아직 확실하지 않지만, 오류 메시지가 나타나지 않는다고해서 나쁜 일이 일어나지 않는다는 것을 의미하지는 않습니다.

내 질문은 왜 auto_ptr에이 오류를 피하기 위해 vInfo를 넣어야합니까? auto_ptr을 사용하지 않고이 작업을 수행 할 수있는 방법이 있습니까? 아니면 vInfo를 전혀 삭제하지 않아도 될까요?

어떤 사람들은이 문제가 내가 문제를 고쳤으므로 쓸모가 없다고 말할 수도 있지만 질문하는 것은이 오류를 수정하는 방법이 아니기 때문에 내가 처음에 문제가있는 이유입니다. 솔루션은 어떤 식 으로든 개정 될 수 있습니다 (auto_ptr을 사용하거나 vInfo를 전혀 삭제하지 않아도 됨).

P. 이 오류는 분명히 내 컴퓨터가 뭔가 이상한 일을하는 것이 아니라 여러 컴퓨터에서 동일한 코드를 실행하고 동일한 결과를 얻었습니다. the documentation 가입일

답변

2

:

[SDL_GetVideoInfo()]은 현재 비디오 하드웨어에 관한 정보를 포함하는 구조로 읽기 전용 포인터를 리턴.

SDL이 가리키는 메모리를 관리하므로 delete을 시도하지 마십시오. 대체로 static 구조체에 대한 포인터를 반환합니다.

비록 SDL (C 라이브러리) 가 메모리를 관리하지이고 당신이 malloc()delete가 ' 결코 전화 메모리를 거라고한다 그것을 청소 할 것으로 예상 경우에도 마찬가지입니다.

+0

괜찮습니다. 삭제해서는 안됩니다. 나는 정적 구조가 무엇인지 모르거나 malloc() 포인터가 내가 C++을 처음 접했을 때 말했듯이 그것을 살펴볼 것입니다. – Aaron

관련 문제