C字符串操作

前端之家收集整理的这篇文章主要介绍了C字符串操作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我缺乏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实际上将事物放入队列中,至少在那时,它期望传入的字符串仍然存在.

我不控制这段代码所以我无法更新它的功能.

解决方法

现在看到问题是如何清理您创建并传递给LoadAndSetUpData()的字符串

我假设:

> LoadAndSetUpData()不会创建自己的副本
>您无法更改LoadAndSetUpData()来执行此操作
>在LoadAndSetupData()返回后,您需要字符串仍然存在一段时间

以下是建议:

>你可以自己调用队列对象吗?是否保证在使用你的字符串之后调用它们.如果是这样,请使用调用delete []的相同字符串创建清理队列事件
>是否有可以依靠的最大数量.如果你创建了一个庞大的字符串数组,你可以在一个循环中使用它们并确保当你回到开头时,可以重用那个字符串
>你有多少时间值得信赖?如果是这样,请在某处注册删除,并在一段时间后检查.

最好的办法是让char *取得所有权或复制的功能.如果没有引用计数或垃圾回收,共享所有权是最难的事情.

原文链接:https://www.f2er.com/c/117162.html

猜你在找的C&C++相关文章