为了说清楚,使用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实际上将事物放入队列中,至少在那时,它期望传入的字符串仍然存在.
解决方法
我假设:
> LoadAndSetUpData()不会创建自己的副本
>您无法更改LoadAndSetUpData()来执行此操作
>在LoadAndSetupData()返回后,您需要字符串仍然存在一段时间
以下是建议:
>你可以自己调用队列对象吗?是否保证在使用你的字符串之后调用它们.如果是这样,请使用调用delete []的相同字符串创建清理队列事件
>是否有可以依靠的最大数量.如果你创建了一个庞大的字符串数组,你可以在一个循环中使用它们并确保当你回到开头时,可以重用那个字符串
>你有多少时间值得信赖?如果是这样,请在某处注册删除,并在一段时间后检查.