【问题标题】:String stream comes up empty [duplicate]字符串流出现空[重复]
【发布时间】:2015-12-09 04:27:13
【问题描述】:

我一直在尝试将整数附加到字符串中,并且在这里尝试了几种解决方案,包括:

std::stringstream ss;

ss << gvHours << "\'" << gvMinutes << "\"" << gvSeconds << ":" << gvTicks;

std::string output(ss.str());
return output.c_str();

std::stringstream ss;
std::string output = "";

ss << gvHours << "\'" << gvMinutes << "\"" << gvSeconds << ":" << gvTicks;

output = ss.str();
return output.c_str();

第一个给我一个空字符串,第二个给我一个不可读的字符,Notepad++ 在黑框中显示为“SOH”。有谁知道我做错了什么?

【问题讨论】:

  • stackoverflow.com/questions/6441218/…。这很可能是您的问题的原因。并且根据您查看字符串的方式,它可能只是因为它包含不可见的字符而为空。例如,SOH 是“标头开始”控制字符(ASCII 代码 2)。
  • 你为什么要返回一个 C 字符串?大声笑

标签: c++ string integer append stringstream


【解决方案1】:

是的,这部分

return output.c_str();

坏了。

当您从std::string 中获取c_str() 时,您只是获得了指向该字符串内容的c 样式指针。但是您没有获得该字符串底层数据的所有权。从函数返回后,该 stringstream 和 string 将被销毁(因为它们是局部变量)并且 c_str() 是一个悬空指针。所以整个事情都是未定义的行为。

【讨论】:

  • 那么,我应该创建一个指向新的 const char* 的指针并返回它吗?
  • @KelvinShadewing,返回std::string 是最明显的建议,但我认为您有理由不这样做。
【解决方案2】:

我修好了。这是我得到的有效代码:

std::stringstream ss;
std::string output;

ss << gvHours << "\'" << gvMinutes << "\"" << gvSeconds << ":" << gvTicks;

output = ss.str();
return output;

在需要它的函数中:

fprintf(gvLog, ">: %s\n", timeString().c_str());

【讨论】:

  • 请注意,您无法删除这个动态分配的字符串对象。每次调用都会泄漏一个字符串。
  • 已编辑。我认为这应该可以解决内存泄漏问题。
  • 太棒了。感谢您的帮助!
猜你喜欢
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 2018-08-11
  • 2018-02-09
相关资源
最近更新 更多