返回字符串的静态方法
static methods returning strings
当我编写这样的代码时,我遇到了一些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% 确定这是库问题时才应该这样做;否则,您将来会为假阴性做好准备。
- 尝试了解在导入的静态方法上使用删除方法时的错误
- 如何通过命名空间调用非静态方法
- 如何在没有实例的情况下获取非静态方法的类型?
- 调用从模板派生的类的静态方法,而不指定模板
- 如何在 c++ 中异步调用静态方法?
- C++ 将静态方法转换为简单方法
- 从另一个标头中的标头调用静态方法
- C++中静态方法的局部变量范围
- 如何启用使用另一个类的静态方法的模板函数的自动推导,从而消除冗长的调用方代码
- 使用本机 JNI 静态方法实现C++ Java 运行时错误
- 当只有静态方法受到影响时,如何解决C++中的链接器错误?
- public:静态常量字符串声明/初始化问题
- 静态变量在同一个翻译单元中被静态方法使用时是否保证被初始化?
- 为什么链接器报告全局函数的乘法定义符号,而不是类静态方法
- 从部分专用模板方法调用模板非静态方法
- 如何使用 c++ 在 cocos2dx 中定义非静态方法
- 使用 CMake 的静态方法链接错误
- 在子类上调用模板化静态方法时获取类的类型名
- 在C++的静态方法中将类名作为字符串获取
- 返回字符串的静态方法