【发布时间】:2012-04-12 05:47:57
【问题描述】:
我正在尝试将一个字符串附加到另一个字符串。我声明了两个全局字符串变量 -
string grid_filename = "grids/";
string rest;
然后我有一个获取命令行参数的函数。每当用户在命令行参数中输入文件名时,它应该存储在 rest 中,然后将 rest 附加到 grid_filename。
else if(strcmp(temp.substr(0,16).c_str(), "--grid-filename=") == 0) {
rest = temp.substr(16,strlen(temp.c_str())-16);
grid_filename.append(rest); //line 74!
}
现在每当我运行我的代码时,valgrind 都会给我这个错误 -
==5602== Address 0x45fdc30 is 0 bytes after a block of size 32 alloc'd
==5602== at 0x402641D: operator new(unsigned int) (vg_replace_malloc.c:255)
==5602== by 0x43039F7: std::string::_Rep::_S_create(unsigned int, unsigned int, std::allocator<char> const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x4304C77: std::string::_Rep::_M_clone(std::allocator<char> const&, unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x4304DA6: std::string::reserve(unsigned int) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x43053E9: std::string::append(std::string const&) (in /usr/lib/i386-linux-gnu/libstdc++.so.6.0.14)
==5602== by 0x804D5AE: get_command_line_args(int, char**) (main.cpp:74)
==5602== by 0x804F138: main (main.cpp:244)
我打印出字符串的两个地址,但它们都不匹配 valgrind 所说的 0 字节。我在这里错过了什么?
我相信这会导致我的第二个错误,因为我将 grid_filename 传递给另一个通过 tcp 连接发送字符串的函数。 Valgrind 告诉我
==5660== Syscall param socketcall.send(msg) points to unaddressable byte(s)
==5660== at 0x404A9B1: send (socket.S:64)
==5660== by 0x804F7C8: main (main.cpp:364)
谁能给我解释一下问题是什么?任何帮助,将不胜感激。如果需要,我可以提供有关代码的更多信息。
【问题讨论】:
-
您给出的第一条错误信息不完整。真正的错误消息必须在您粘贴的文本的正上方,关于读取或写入 0x45fdc30 的内容。然后,valgrind 打印您粘贴的消息,它会告诉您有关该地址的一些信息。
-
我发布的第二条错误消息出现在我发布的第一条消息的正上方。我认为它们是分开的,所以我分别写了它们。整个消息应该以“Syscall param socketcall.send(msg) points to unaddressable byte(s)”开头,然后是“Address 0x45fdc30 is 0 bytes after a block of size 32 alloc'd”消息。
-
好的,所以我们需要查看您的发送调用,因为显然它传递了一个无效指针,该指针恰好指向 在 由 grid_filename.append( )。
-
您知道
std::string提供==用于比较,length()提供长度吗? -
如果您提供一个完整、简短程序来演示错误,我们将能够更有效地帮助您。删除所有对问题没有影响的内容,然后在您的问题中发布该 short 程序。请参阅:sscce.org。
标签: c++ string append valgrind