ゲーム エンジンで読み込まれた同じテクスチャの重複を避けるために、コンテンツ管理システムを作成しています。以下は、以前にロードされたオブジェクトからコンテンツを取得するための関数、または使用可能なオブジェクトがない場合に新しいオブジェクトをロードするための関数です。
template <class T>
T* GetContent(const char* path) {
// Check if it already exists, if yes return it
for (ContentEntry& entry : m_ContentList) {
// Same Type?
if (strcmp(entry.Type, T::GetType()) == 0)
// Same Path?
if (strcmp(entry.C->GetPath(), path) == 0)
return (T*)entry.C;
}
// Since it doesn't exist, create it
ContentEntry contentEntry (
T::GetType(),
(Content*)new T(path));
// Add it to the list
m_ContentList.push_back(contentEntry);
// And Return it
return (T*)contentEntry.C;
}
これは、コンテンツ エントリとそれらが格納されているベクトルを格納するために使用される構造体です。
struct ContentEntry {
const char* Type;
Content* C;
ContentEntry(const char* type, Content* c) :
Type(type),
C(c)
{ }
~ContentEntry() {
delete C;
}
};
std::vector<ContentEntry> m_ContentList;
この関数が値を返そうとするたびに、アプリがクラッシュします。contentEntry をポインターに変更すると (その周りのコードを適切に更新すると)、問題なく返されますが、ベクター全体を変更して ContentEntry ポインターを指すようにし、可能であれば回避したいものを手動で削除する必要があります。この機能を正しく動作させるにはどうすればよいですか?
さらに、ポインタを使用して foreach ループをステップ実行すると、明確な理由もなくベクトルが大幅に増加するように見えます。これを防ぐにはどうすればよいですか?
編集:今のところクラッシュの問題は修正されていますが、後で調整しますが、制御不能なベクトルはまだそこにあります。
Edit2:関数を終了した後、成長するベクトルが消えているように見えるので、何かを回答としてマークします。