C++ 返回字符串的静态方法
当我编写这样的代码时,我遇到了一些valgrind问题: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
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带来问题。你能构造出一个完整的测试用例来给你带来错误吗?第二个代码片段绝对不是