Ошибка отладки при удалении указателя SDL_VideoInfo

Я делаю игру в SDL и использую 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, но после всех просмотренных мной книг и видео по С ++ все они посылают сообщение о том, что не удаление ваших указателей является кощунством программирования. Так что (очевидно) удаление vInfo — мой единственный выбор.

Я так думаю, считать Я исправил это, выполнив это, или, по крайней мере, когда я делаю это, сообщения Debug Assertion Failed отсутствуют: (Еще раз, делая это из памяти, у меня могут быть некоторые орфографические ошибки или опечатки, которые могут вызвать ошибку, но вы должны получить точка).

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;
}

Киньте его в авто указатель, и все получится. Хотя я все еще не уверен, решает ли это проблему; только то, что я не получаю сообщение об ошибке, не означает, что что-то плохое не происходит.

Мой вопрос: почему я должен поместить vInfo в auto_ptr, чтобы избежать этой ошибки, есть ли способ, которым я могу сделать это без использования auto_ptr, или мне вообще нужно беспокоиться об удалении vInfo?

Некоторые люди могут сказать, что этот вопрос бесполезен, так как я исправил проблему, но я спрашиваю не о том, как исправить эту ошибку, а о том, почему я получил проблему в первую очередь, и если мое решение может быть пересмотрено любым способом (без необходимости использовать auto_ptr или вообще без необходимости удалять vInfo).

Постскриптум Эта ошибка, конечно, не только из-за того, что мой компьютер делает что-то странное, я запускаю один и тот же код на нескольких компьютерах и получаю одинаковый результат.

1

Решение

От документация:

[SDL_GetVideoInfo()] Возвращает указатель только для чтения в структуру, содержащую информацию о текущем видеооборудовании.

SDL управляет направленной памятью, поэтому не пытайтесь delete Это. По всей вероятности, он возвращает указатель на static состав.

Хотя даже если SDL (библиотека C) не было управление памятью и ожидал, что вы очистите ее, вы должны никогда вызов delete на malloc()память

2

Другие решения

Других решений пока нет …