我缺乏 C++ 经验,或者更确切地说,我在垃圾收集语言方面的早期学习现在真的让我很痛苦,我在使用 C++ 中的字符串时遇到了问题。
说得很清楚,使用 std::string 或 equlivents 不是一种选择——这一直是 char* 。
所以:我需要做的非常简单,基本上可以归结为连接字符串。在运行时,我有 2 个类。
一个类包含基本文件名形式的“类型”信息。
在标题中:
char* mBaseName;
后来,在 .cpp 中,它加载了从其他地方传入的信息。
mBaseName = attributes->BaseName;
第二个类以基本文件名后缀的形式提供版本信息,它是一个静态类,目前实现如下:
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 实际上将事物放入队列中,至少在那时,它期望传入的字符串仍然存在。
我不控制此代码,因此无法更新它的功能。