1

私は 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このエラーは確かに私のコンピューターが奇妙なことをしているだけではありません。複数のコンピューターで同じコードを実行し、同じ結果を得ました。

4

1 に答える 1

2

ドキュメントから:

[ ]現在のビデオ ハードウェアに関する情報を含む構造体への読み取り専用ポインターSDL_GetVideoInfo()を返します。

SDL は指定されたメモリを管理しているので、それを試みないdeleteでください。staticおそらく、構造体へのポインタを返しています。

ただし、SDL (C ライブラリ)がメモリを管理しておらず、クリーンアップすることを期待していたとしても、'd メモリを呼び出すべきではありません。deletemalloc()

于 2012-11-20T17:38:57.303 に答える