瓦尔格林德 - 可能失去了警告
Valgrind -- possibly lost warning
我有下面的代码:
std::string myName = "BLABLABLA";
//check if there are illegal characters
for (unsigned int i = 0; i < myName.length(); i++)
{
const char& c = myName[i];
if (!(isalnum(c) || (c == '_') || (c == '-')))
{
return 0;
}
}
这是 valgrind 在行 "const char& c = myName[i];" 的输出
==17249== 51 bytes in 1 blocks are possibly lost in loss record 116 of 224
==17249== at 0x4C2714E: operator new(unsigned long) (vg_replace_malloc.c:261)
==17249== by 0x602A498: std::string::_Rep::_S_create(unsigned long, unsigned long,
std::allocator<char> const&) (in /usr/lib64/libstdc++.so.6.0.16)
==17249== by 0x602A689: std::string::_M_mutate(unsigned long, unsigned long,
unsigned long) (in /usr/lib64/libstdc++.so.6.0.16)
==17249== by 0x602AFB5: std::string::_M_leak_hard() (in
/usr/lib64/libstdc++.so.6.0.16)
==17249== by 0x602B0A4: std::string::operator[](unsigned long) (in /
/usr/lib64/libstdc++.so.6.0.16)
我认为这没有任何问题...
是的,这是可怕的 COW 实现!您还可以强制使用 const(因此是非变异的)重载,如下所示:
std::string const myName = "BLABLABLA";
//check if there are illegal characters
for (unsigned int i = 0; i < myName.length(); i++)
{
const char& c = myName[i];
if (!(isalnum(c) || (c == '_') || (c == '-')))
{
return 0;
}
}
或(如果您不想修改原始字符串类型):
std::string myName = "BLABLABLA";
std::string const &cref = myName;
//check if there are illegal characters
for (unsigned int i = 0; i < myName.length(); i++)
{
const char& c = cref[i];
if (!(isalnum(c) || (c == '_') || (c == '-')))
{
return 0;
}
}
等。
COW参考,因为我知道我在某处写过一些关于它的东西。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 在未链接的部分上生成警告
- 警告 C4552:">>":未使用表达式的结果
- 警告隐性转换失去整数精度
- 瓦尔格林德 - 可能失去了警告
- 使用陆地时失去精度警告