当我启动 valgrind 时,一切正常,但从这个错误开始,接下来的行开始表现相同(无效读取等)。
Invalid read of size 1
==5134== at 0x4C2BFE7: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==5134== by 0x40C553: XAMBO::listing_start(std::string&) (listing.cpp:616)
==5134== by 0x40DAD7: msg_callback(unsigned char*) (msg_callback_act.cpp:263)
其中listing.cpp的函数如下(该函数取一个字符串并删除逗号,并将结果放入一个数组中。我从数组中随机选择结果,并将其放入一个字符串中并返回1个字符串结果)
listing_start(string& _string){
string pick, tkn;
size_t pos = 0;
string delimiter = ",";
const char *service[MAX_SERVICE];
int i= 0,random_val= 0;
std::string::iterator e = std::remove(_string.begin(),_string.end(), ' ');
_string.erase(e, _string.end());
while ((pos = _string.find(delimiter))!= std::string::npos) {
tkn = _string.substr(0, pos);
if (!tkn.empty()) service[i] = tkn.c_str();
i++;
_string.erase(0, pos + delimiter.length());
}
service[i] = _string.c_str();
random_val = rand()%i;
strcpy((char*)pick.c_str(), service[random_service]);
return pick;
}
valgrind 指向的行是这样的: strcpy((char*)wanted_service.c_str(), service[random_service]);
我无法弄清楚为什么上面一行中的 stringcopy 不能正常工作(尽管当我打印结果时,我有我想要的)。为什么 valgrind 抱怨,我应该如何修复上面的代码?