私は 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;
}
これを最初に数回実行すると、問題なく動作しますが、[Debug Assertion Failed] ウィンドウが表示されます。それが何を意味するのかよくわかりませんが、メモリリークと関係があると思いますか? 私はここでJavaから来ているので、メモリリークやポインタなどはすべて初めてなので、ちょっと混乱しています。
とにかく、vInfo を削除しないとコードは正常に動作しますが、私が見たすべての C++ の本やビデオの後で、それらはすべて、ポインターを削除しないとプログラミングが冒涜であるというメッセージを送信します。したがって、(どうやら) 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 を使用せずにこれを行う方法はありますか?
問題を修正したので、この質問は役に立たないと言う人もいるかもしれませんが、私が求めている質問は、このエラーを修正する方法ではなく、そもそも問題が発生した理由であり、解決策を修正できるかどうかです何らかの方法で (auto_ptr を使用する必要がない、または vInfo をまったく削除する必要がない)。
PSこのエラーは確かに私のコンピューターが奇妙なことをしているだけではありません。複数のコンピューターで同じコードを実行し、同じ結果を得ました。