У меня есть код ниже:
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!
Вы также можете принудительно использовать константные (и, следовательно, не мутирующие) перегрузки следующим образом:
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 ссылка, потому что я знал, что где-то написал об этом.
Других решений пока нет …