C++ 从std::string转换为const char*会导致';Syscall param socketcall.sendto(msg)指向不可寻址字节&x27;valgrind中的错误

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

在使用libmicrohttpd库时,我在将
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;
}