libmicrohttpd在html响应中发送垃圾(const char * vs std :: string.data())

时间:2018-09-13 04:10:58

标签: c++

当我使用 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);

enter image description here

垃圾已发送:

    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);

enter image description here

1 个答案:

答案 0 :(得分:2)

阅读documentation

  

模式

     

缓冲区的内存管理选项;如果使用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必须是正确的选择。