我缺乏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()类似的代码,因此需要解决.这令人沮丧,因为我对于看待安全和"非hacky"解决方案的工作方式还不太了解.在C#中,我只想写:
LoadAndSetupData(mBaseName + GetSuffix());
而且不用担心.
任何评论,建议或建议非常感谢.
我调用LoadAndSetupData()的代码的问题是,在某些时候它可能会复制文件名并将其保留在本地,但实际的实例化是异步的,LoadAndSetupData实际上将事物放入队列中,至少在那时,它期望传入的字符串仍然存在.
我不控制这段代码所以我无法更新它的功能.