当我使用 std :: string的data()发送html时,会在字符串的开头发送一些垃圾:
工作正常:
const char* html2 = "Free for personal and commercial use under the CCA 3.0 license";
response = MHD_create_response_from_buffer(strlen(html2), (void *) html2, MHD_RESPMEM_PERSISTENT);
垃圾已发送:
std::string html = "Free for personal and commercial use under the CCA 3.0 license";
response = MHD_create_response_from_buffer(strlen(html.data()), (void *) html.data(), MHD_RESPMEM_PERSISTENT);
答案 0 :(得分:2)
模式
缓冲区的内存管理选项;如果使用MHD_RESPMEM_PERSISTENT 缓冲区是静态/全局内存,如果MHD_RESPMEM_MUST_FREE 缓冲区是堆分配的,应由MHD和 MHD_RESPMEM_MUST_COPY如果缓冲区位于临时内存中(即 堆栈),并且必须通过MHD复制
很明显,您必须使用MHD_RESPMEM_MUST_COPY
而不是MHD_RESPMEM_PERSISTENT
。否则,看起来,它将在字符串的生存期之后保留指向string::data()
的指针,这是未定义的行为。堆只是在被重用,这就是为什么会变得垃圾。
请注意,使用char*
字面量“ 缓冲区是静态/全局内存”,因此MHD_RESPMEM_PERSISTENT
与第一个变量兼容。但是在第二个变体中,绝不坚持“ 缓冲区是静态/全局内存”。第二个变体更符合“缓冲区位于临时内存中(即在堆栈中)” ,因此MHD_RESPMEM_MUST_COPY
必须是正确的选择。