【问题标题】:C++ c_str of std::string returns emptystd::string 的 C++ c_str 返回空
【发布时间】:2021-06-30 05:22:32
【问题描述】:

所以,我遇到了以下代码的问题,std::cout << cstr << std::endl 的结果是单个字符

PyObject * CKKSwrapper::SerializeContext() {
    std::string s;                                      // 1
    std::ostringstream os(s);                           // 2
    Serial::Serialize(m_cc, os, SerType::BINARY);   // 3
    const std::string string_repr = os.str();                   // 4
    std::cout << string_repr << std::endl;                      // 5

    char *cstr = new char[string_repr.length() + 1];            // 6
    std::strcpy(cstr, string_repr.c_str());                     // 7
    std::cout << "******************************************************" << std::endl; // 8

    std::cout << string_repr << std::endl;                      // 9
    std::cout << "******************************************************" << std::endl; // 10
    std::cout <<  cstr << std::endl;                    // 11

    auto resp = PyBytes_FromString(cstr);               // 12
    return resp;
}

检查第 5 行的 std::cout 结果看起来不错,并且不是空的。

@ � �4 lbcrypto::LPCryptoParametersCKKSlbcrypto::DCRTPoly �@ �

^ 前几个字符(不确定是否有帮助)

稍后,我创建了一个 char 数组并将 c_str 复制到其中(我认为)避免了 https://stackoverflow.com/a/39006531/3532564 中讨论的临时结果问题

不要试图存储 c_str() 返回的指针。如果您需要将该字符串作为 C 字符串长时间使用,请自行为其分配内存缓冲区并将 c_str() 的结果复制到该缓冲区。


我还发现了https://stackoverflow.com/a/35981001/3532564,这让我想知道我的string_repr 对象是否被破坏了,所以我在第 9 行做了一个 std::cout,它看起来也不错。


谁能帮帮我?我真的不确定问题出在哪里。不幸的是,我需要将char * [] 传递给PyBytes_FromString,尽管这个名字可能会让人想到

【问题讨论】:

  • 你知道strcpy()是如何知道需要复制多少个字符的吗?找到这个问题的答案后,看看string_repr中的第二个字符是什么,然后你应该就能自己弄清楚了!
  • 这很可能是由 NUL 引起的,正如之前的评论者所建议的那样。尝试改用PyBytes_FromStringAndSize。同样,您不需要自己复制字符串,因为 PyBytes 会自行复制。

标签: c++ string stdstring


【解决方案1】:

推测该字符串包含一个或多个nul 字符,导致strcpy() 未复制所有字节。在从函数返回之前没有释放 cstr 也会导致内存泄漏。

您可以通过绕过不必要的字符串数组并调用PyBytes_FromStringAndSize来避免这两个问题:

return PyBytes_FromStringAndSize(string_repr.c_str(), string_repr.size());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 2017-03-26
    • 2018-11-22
    • 2022-10-27
    • 2023-01-11
    • 2021-07-10
    • 2012-04-17
    • 2013-04-14
    相关资源
    最近更新 更多