返回字符串的静态方法

static methods returning strings

本文关键字:静态方法 字符串 返回      更新时间:2023-10-16

当我编写这样的代码时,我遇到了一些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返回的任何内容都应与对象封装function具有相同的生存期。还是我的分析有缺陷?

谢谢

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

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

还是我的分析有缺陷?

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

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

我遇到了一些瓦尔格林德问题

完全!那是Valgrind的问题,而不是你的代码问题。瓦尔格林德并不总是正确的,在这种情况下,它会给你虚惊一场。只是忽略它。

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

不。静态函数和静态变量是两个不同的东西。此外,代码的第二个版本在多线程环境中引入了可能的问题。

不这样做,您将失去线程安全性。第一个功能很好,没有内存泄漏。您创建了一个临时std::string,但这没关系,无需担心,它可以完美地处理分配的内存。你必须阅读瓦尔格林德的警告:我不是警告瓦尔格林德认为这可能是丢失的字节。现在你可以去向自己保证,什么都不会丢失。IIRC有可能告诉瓦尔格林德,这次一切都很好。

第一个片段很好;第二个片段肯定不好(它只保证在你第一次使用它时正常工作)。

其他人似乎都在告诉你不要理会瓦尔格林德;不要那样做。 您还没有向我们展示其余代码,很可能在其他地方存在问题,仅在此处表现出来。

第二种选择是你的C++库正在做一些古怪的事情,不必要地触发了Valgrind。 如果是这样,那么解决方案是使用抑制文件。 但是,只有在 100% 确定这是库问题时才应该这样做;否则,您将来会为假阴性做好准备。