私の C++ の経験不足、またはガベージ コレクション言語での初期の学習は、現時点では本当に私を悩ませており、C++ で文字列を操作する際に問題があります。
非常に明確にするために、 std::string または equlivents を使用することはオプションではありません-これはずっと char* です。
つまり、私がしなければならないことは非常に単純で、基本的には文字列を連結することです。実行時には、2 つのクラスがあります。
1 つのクラスには、ベース ファイル名の形式で「タイプ」情報が含まれます。
ヘッダーで:
char* mBaseName;
その後、.cpp では、他の場所から渡された情報が読み込まれます。
mBaseName = attributes->BaseName;
2 番目のクラスは、ベース ファイル名のサフィックスの形式でバージョン情報を提供します。これは静的クラスであり、現在次のように実装されています。
static const char* const suffixes[] = {"Version1", "Version", "Version3"}; //etc.
static char* GetSuffix()
{
int i = 0;
//perform checks on some data structures
i = somevalue;
return suffixes[i];
}
次に、実行時に基本クラスが必要なファイル名を作成します。
void LoadStuff()
{
char* suffix = GetSuffix();
char* nameToUse = new char[50];
sprintf(nameToUse, "%s%s",mBaseName,suffix);
LoadAndSetupData(nameToUse);
}
そして、問題はすぐにわかります。nameToUse は削除されず、メモリ リークが発生します。
サフィックスは固定リストですが、ベースファイル名は任意です。作成された名前は、「LoadStuff()」の終わりを超えて存続する必要があります。これは、いつ、どのように使用されるかが明確でないためです。
私が心配しすぎているか、非常に愚かなのかもしれませんが、LoadStuff() と同様のコードが他の場所でも発生するため、解決する必要があります。安全で「ハッキングされていない」ソリューションを確認するために物事がどのように機能するかについて十分に知らないので、イライラします. C# では、次のように記述します。
LoadAndSetupData(mBaseName + GetSuffix());
心配する必要はありません。
コメント、提案、またはアドバイスをいただければ幸いです。
アップデート
LoadAndSetupData() を呼び出しているコードの問題は、ある時点でおそらくファイル名をコピーしてローカルに保持することですが、実際のインスタンス化は非同期であり、LoadAndSetupData は実際に物事をキューに入れ、その時点で少なくとも、渡された文字列がまだ存在することが期待されます。
私はこのコードを制御していないため、機能を更新できません。