返回字符串的静态方法

时间:2013-01-31 19:18:39

标签: c++ string valgrind

当我编写这样的代码时,我遇到了一些valgrind问题:

static std::string function(std::string test)
{
        size_t pos = test.find(',');
        if (pos == test.npos)
        {
            // no comma
            //
            pos = test.length();
        }

        return test.substr(0, pos); //Valgrind is reporting possibly lost bytes here

}

现在我的问题是我应该这样做吗?

static std::string function(std::string test)
{
        size_t pos = test.find(',');
        if (pos == test.npos)
        {
            // no comma
            //
            pos = test.length();
        }
        static std::string temp = test.substr(0, pos);
        return temp;

}

我认为将字符串temp设置为静态非常重要,因为function是静态的,因此function返回的任何内容都应与包含{{1}的对象具有相同的生命周期。 }}。或者我的分析存在缺陷?

谢谢

4 个答案:

答案 0 :(得分:2)

  

我有一些valgrind问题

完全!那是Valgrind的问题,而不是你的代码问题。 Valgrind并不总是正确的,在这种情况下,会给你误报。只是忽略它。

  

现在我的问题是我应该这样做吗?

没有。静态函数和静态变量是两回事。此外,第二版代码在多线程环境中引入了可能的问题。

答案 1 :(得分:2)

不要这样做,你将失去线程安全。第一个功能很好,没有内存泄露。你创建一个std::string临时,但没关系,它完全处理分配的内存。你必须阅读这封信的valgrind警告:我是一个警告 valgrind 认为它是可能丢失的字节。现在可以去确保没有任何东西丢失。 IIRC有可能告诉valgrind这次一切都好。

答案 2 :(得分:2)

  

现在我的问题是我应该这样做吗?

不,绝对不是。无需创建这样的临时(特别是不是static,使函数不可重入,或者最终只在您的情况下第一次工作)。我想, Valgrind 正在报告垃圾。你的代码看起来很好。

  

或者我的分析存在缺陷?

是的,确实如此。 static类方法没有与之关联的对象,无论如何都可能具有不同的生命周期(它就像一个普通的非类函数,只需要在调用时用类名来限定它) 。除此之外,您不会返回对任何临时string的引用,而是从temp复制一个新对象,因此这里不会考虑生命周期问题。

除此之外,您可能需要考虑通过const-reference获取test对象,因为您不修改或复制它(这可能与对象标识和对象值的一般误解有关吗?)

答案 3 :(得分:2)

第一个片段很好;第二个片段绝对没有问题(只有在你第一次使用它时才能保证正常工作)。

其他人似乎都在告诉你要忽视Valgrind; 不要那样做。你还没有向我们展示你的其余代码,很可能在其他地方出现了一个只在这里出现的问题。

第二种选择是您的C ++库正在做一些古怪的事情,这会不必要地触发Valgrind。如果是,那么解决方案是使用suppression file。但是,如果您 100%确定它是库问题,那么您应该这样做;否则你将来会为自己设置假阴性。