Valgrind - 可能失去了警告

时间:2012-09-26 14:46:12

标签: c++ valgrind

我有以下代码:

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&amp; 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)

我认为这没有任何问题...

1 个答案:

答案 0 :(得分:2)

是的,这是可怕的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 reference,因为我知道我在某个地方写过一些东西。