【问题标题】:c_str() returns empty string [duplicate]c_str() 返回空字符串 [重复]
【发布时间】:2016-08-17 21:22:48
【问题描述】:

由于某种原因 c_str() 返回空字符串,参数const chart**out_function 将保存文件操作的方法名称,如fopen 所以基本上我所做的是将我必须的字符串转换为 c_str() 但我得到一个空下面的字符串是我如何调用的

在这部分我只是准备了一个带有操作名称的字典,你可以注意到我只是将“fopen”作为字符串发送

    pp::VarDictionary fileOp;
    pp::VarArray args;
    args.Set(0, "filename.txt");
    args.Set(1, "wb");
    fileOp.Set("args", args);
    fileOp.Set("cmd", "fopen");

这个函数会解析上面发送的字典,并在out_params中返回out_functionargs中的函数名称

    int ParseMessage(pp::Var message, const char** out_function,
        pp::Var* out_params) {

我使用这行代码将字符串转换为c_string,但它返回空文本

*out_function =  cmd_value.AsString().c_str();

这是完整的代码,它基于 Google Native Client,但同时它是标准的 C/C++ 代码

http://pastebin.com/S4P8aZqL

【问题讨论】:

  • 您正在存储一个指向已销毁临时对象的指针。
  • 不要垃圾标签。没有语言“C/C++”,sn-ps 显然是 C++,而不是 C。
  • 这三个都涉及到,我不是想发垃圾邮件
  • @MohammadAbuMusa C++ 中的编码不足以标记 C。您正在使用 std::string、命名空间和 OOP。那不是 C。

标签: c++ google-nativeclient


【解决方案1】:

c_str() 的结果仅在产生该结果的 std::string 对象有效时才有效。

在您的情况下,AsString() 调用会产生一个 临时 std::string 对象,然后立即销毁该对象。之后,c_str() 调用的结果不再有意义。试图访问该指针指向的内存会导致未定义的行为。

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

另一个(更好的)想法是不要急于转换为 C 字符串。将结果返回为std::string 并在最后一刻调用c_str():当你真的真的需要一个C 字符串时。

【讨论】:

  • 感谢您的回答,这是我用来解决此问题的代码*out_function = strdup(cmd_value.AsString().c_str());
  • @Mohammad Abu Musa:这会解决它,但现在你有一个 malloced 的原始内存块需要手动管理。正如我所说,一个更好的主意是切换到使用std::string 直到最后一刻。
  • 谢谢,我就是这么做的,我认为使用std::string 是一种更好的方法
猜你喜欢
  • 2017-05-05
  • 2018-09-27
  • 2018-11-22
  • 1970-01-01
  • 2015-05-18
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多