これはC++メモリ管理上の問題ですので、私はここで質問しました。 私はSFMLでゲームを作成しています。以前はSDLを使用していましたが、テクスチャを管理するのは非常に簡単でしたが、SFMLの動作は異なります。SFMLテクスチャメモリ管理
マイプロジェクトのセットアップはとてもようなものです:
class Game
//create window and initialize game stuff
class Character
/*initializes its own textures and is also responsible for updating itself
as well as drawing itself*/
int main()
/*create an instance of Game -> Create an instance of Character and
runGame. I will implement the drawing and updating properly when I
implement a scene graph and scene nodes but for now updating and drawing is
done via global functions called by the Game Class*/
私が直面した課題は白い長方形でスプライト画像結果の文字クラスにSF ::テクスチャを使用して描かれているということでした。文字スプライトはテクスチャリンクを失い、SFMLは白い四角形を描画します。これを解決するために、生のテクスチャポインタを作成し、それをCharacterコンストラクタで初期化しました。これが動作し、Spriteが正しく描画されます。
//inside character.hpp
sf::Texture *texture;
//in Character constructor
texture= new (sf::Texture);
これはメモリを管理しなければならず、コードが醜いと感じることを意味します。
私は、メモリリークを防ぐために割り当てられたメモリ(と思う)を管理するために、これを試してみました:
Character::~Character()
{ delete texturePtr; }
が、それは明らかに間違っています。 私はまた、アプリケーションを終了するが、エラーの原因となるmain()の終わりにcharacter.Textureを削除しようとしました。
私は、文字コンストラクタ内uinque_ptrを使用する実行しようとしました:
std::unique_ptr<sf::Texture> texture(new sf::Texture);
//load Texture from Resource Manager instance
、これは代わりに、スプライトテクスチャの素敵なネイビーブルー、黒の四角形を描画します。どうやって宣言して後でunique_ptrを初期化できるかわからない。
私はメモリが漏れていると思います。どうすれば正しくスマートポインタを使用したり、自分のメモリを適切に管理できますか?
私は漠然としていると分かりましたが、少し詳細とコードを追加しました。また、私はテクスチャを照会してSprite Rectディメンションを設定して確実にロードされるようにしていますが、安全のために、呼び出し元のリソースがロードされているかどうかを確認するログ機能があります。
あなたが間違っていることを確認するのに十分なコードを教えてくれませんでした。つまり、 'unique_ptr'を使うのは良い考えです。あなたのテクスチャが青くなっている場合は、初期化バグのように聞こえます。また、 'unique_ptr <...> foo(new whatever)'の代わりに 'make_unique'を使うことを検討してください。 – Rook
あなたはあなたの古いやり方には問題があったと言いましたが、決してそれについて質問しませんでした。あなたは、あなたが持っていてはならない問題に対する解決策を探しています。あなたは*白いスプライトの最初の問題*についての質問をするべきです。 – nvoigt