当我编写这样的代码时,我遇到了一些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}的对象具有相同的生命周期。 }}。或者我的分析存在缺陷?
谢谢
答案 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%确定它是库问题,那么您应该这样做;否则你将来会为自己设置假阴性。