Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 返回字符串的静态方法_C++_String_Valgrind - Fatal编程技术网

C++ 返回字符串的静态方法

C++ 返回字符串的静态方法,c++,string,valgrind,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(); } retur

当我编写这样的代码时,我遇到了一些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
static有点重要,因为
function
是静态的,所以
function
返回的任何内容都应该与包含
function
的对象具有相同的生存期。还是我的分析有缺陷

多谢各位

我有一些问题

没错!这是Valgrind的问题,而不是您的代码问题。Valgrind并不总是正确的,在这种情况下,它会给你虚惊一场。别理它

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

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;

}
不,静态函数和静态变量是两码事。此外,代码的第二个版本还引入了多线程环境中可能出现的问题

我有一些问题

没错!这是Valgrind的问题,而不是您的代码问题。Valgrind并不总是正确的,在这种情况下,它会给你虚惊一场。别理它

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

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;

}

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

如果不这样做,您将失去线程安全性。第一个功能很好,没有内存泄漏。您可以创建一个
std::string
temporary,但没关系,不用担心,它可以完美地处理分配的内存。你必须仔细阅读valgrind的警告:我是一个警告,valgrind认为它可能丢失了字节。现在你可以去确保没有损失。
IIRC有可能告诉valgrind这次一切正常。

不要这样做,你会失去线程安全性。第一个功能很好,没有内存泄漏。您可以创建一个
std::string
temporary,但没关系,不用担心,它可以完美地处理分配的内存。你必须仔细阅读valgrind的警告:我是一个警告,valgrind认为它可能丢失了字节。现在你可以去确保没有损失。 IIRC有可能告诉valgrind这次一切都好

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

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
复制的新对象,因此这里不需要考虑生命周期问题

<>除此之外,您还可以考虑通过const引用来考虑<代码>测试>代码>对象,因为您不修改也不复制它(这可能与对对象标识和对象值的一般误解有关)。 现在我的问题是我应该这样做吗

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
复制的新对象,因此这里不需要考虑生命周期问题


<>除此之外,您还可以考虑通过const引用来考虑<代码>测试>代码>对象,因为您不修改也不复制它(这可能与对对象标识和对象值的一般误解有关)。

< P>第一个片段是好的;第二个代码段绝对不好(它只保证在您第一次使用它时正常工作)

其他人似乎都在告诉你,不要理会瓦尔格林不要这样做。您还没有向我们展示您的代码的其余部分,很可能在其他地方有一个问题,它只是在这里表现出来


第二种选择是,C++库做了一些古怪的事情,这不必要地触发了ValGRAND。如果是这样的话,那么解决方案就是使用。但只有当你100%确信这是图书馆的问题时,你才应该这样做;否则,您将在将来设置自己的错误否定。

第一个片段很好;第二个代码段绝对不好(它只保证在您第一次使用它时正常工作)

其他人似乎都在告诉你,不要理会瓦尔格林不要这样做。您还没有向我们展示您的代码的其余部分,很可能在其他地方存在问题,只是在这里显示自己


第二种选择是,C++库做了一些古怪的事情,这不必要地触发了ValGRAND。如果是这样的话,那么解决方案就是使用。但只有当你100%确信这是图书馆的问题时,你才应该这样做;否则,您将在将来设置自己为假阴性。

既然您没有修改任何内容,为什么不通过const reference传递呢?嗯,不清楚为什么第一个片段会给Valgrind带来问题。你能构造出一个完整的测试用例来给你带来错误吗?第二个代码片段绝对不是