C++ 从std::string转换为const char*会导致';Syscall param socketcall.sendto(msg)指向不可寻址字节&x27;valgrind中的错误
在使用libmicrohttpd库时,我在将C++ 从std::string转换为const char*会导致';Syscall param socketcall.sendto(msg)指向不可寻址字节&x27;valgrind中的错误,c++,string,http,valgrind,C++,String,Http,Valgrind,在使用libmicrohttpd库时,我在将string转换为const char*并使用它从缓冲区调用MHD\u create\u response\u时遇到了一个奇怪的错误 这会导致网页响应的格式严重错误,偶尔会显示二进制数据,更罕见的是,浏览器会认为这是一个文件并下载它 真正奇怪的是,如果我发送一个常规的常量字符,错误就不会出现,比如 const char*cstring=“这是一个页面” 仅当我从字符串转换为常量字符*时 const char*cstring=page.c_str() V
string
转换为const char*
并使用它从缓冲区调用MHD\u create\u response\u时遇到了一个奇怪的错误
这会导致网页响应的格式严重错误,偶尔会显示二进制数据,更罕见的是,浏览器会认为这是一个文件并下载它
真正奇怪的是,如果我发送一个常规的常量字符,错误就不会出现,比如
const char*cstring=“这是一个页面”代码>
仅当我从字符串
转换为常量字符*
时
const char*cstring=page.c_str()代码>
Valgrind输出:
==11105== Thread 2:
==11105== Syscall param socketcall.sendto(msg) points to unaddressable byte(s)
==11105== at 0x617464B: send (send.c:31)
==11105== by 0x565986F: ??? (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x565737D: ??? (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x565DA3C: MHD_run_from_select (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x565DC8A: ??? (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x565DDA1: ??? (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x876B0A3: start_thread (pthread_create.c:309)
==11105== by 0x617362C: clone (clone.S:111)
==11105== Address 0xe499448 is 24 bytes inside a block of size 56 free'd
==11105== at 0x4C2A360: operator delete(void*) (vg_replace_malloc.c:507)
==11105== by 0x401CA5: http_connect(void*, MHD_Connection*, char const*, char const*, char const*, char const*, unsigned long*, void**) (in /home/shpoople/projects/http/main)
==11105== by 0x5656F70: ??? (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x5658427: ??? (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x565D988: MHD_run_from_select (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x565DC8A: ??? (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x565DDA1: ??? (in /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10.27.0)
==11105== by 0x876B0A3: start_thread (pthread_create.c:309)
==11105== by 0x617362C: clone (clone.S:111)
==11105==
以及用于发送数据的函数(位于,仅修改为使用std::string
):
我似乎已经自己解决了这个问题。抱歉问了一个不必要的问题
通过将MHD\u create\u response\u from\u buffer
上的第三个参数从MHD\u RESPMEM\u PERSISTENT
更改为MHD\u RESPMEM\u MUST\u COPY
再次表示歉意。我似乎已经自己解决了这个问题。抱歉问了一个不必要的问题
通过将MHD\u create\u response\u from\u buffer
上的第三个参数从MHD\u RESPMEM\u PERSISTENT
更改为MHD\u RESPMEM\u MUST\u COPY
再次表示歉意。您的参数std::string page
是一个局部变量。此函数完成后,将释放其内存
另一方面,函数MHD\u run\u from\u select
和相关函数显然在单独的线程上运行。当该线程尝试访问缓冲区时,std::string page
的内存已被释放
您应该确保缓冲区保持活动状态,或者以不同的方式分配缓冲区,或者在得到响应之前阻塞主线程 您的参数std::string page
是一个局部变量。此函数完成后,将释放其内存
另一方面,函数MHD\u run\u from\u select
和相关函数显然在单独的线程上运行。当该线程尝试访问缓冲区时,std::string page
的内存已被释放
您应该确保缓冲区保持活动状态,或者以不同的方式分配缓冲区,或者在得到响应之前阻塞主线程 谢谢你的回复。该函数有一个用于复制缓冲存储器的标志,MHD\u RESPMEM\u必须\u COPY
感谢您的回复。该函数有一个用于复制缓冲存储器的标志,MHD\u RESPMEM\u MUST\u COPY
static int send_page (struct MHD_Connection *connection, std::string page) {
int ret;
struct MHD_Response *response;
const char* cstring = page.c_str();
response = MHD_create_response_from_buffer (strlen (cstring), (void *) cstring, MHD_RESPMEM_PERSISTENT);
if (!response) {
return MHD_NO;
}
ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response (response);
return ret;
}