【问题标题】:ostringstream gets wrong int value after incrementation [c++]ostringstream 在递增后得到错误的 int 值 [c++]
【发布时间】:2015-10-22 19:27:44
【问题描述】:

这是我的代码的一部分:

for(int i=0; i<10; i++)
{
    tab[i]=new char[80];
    oss.str("");
    oss<<"line number: <<i;
    temp=oss.str();
    tab[i]=(char*)temp.c_str();
}

当我打印标签时,结果是轮流 8 和 9。我做错了什么吗?

【问题讨论】:

  • 你确定吗?因为这甚至不应该编译。请发帖minimal reproducible example
  • (char*)temp.c_str() 坏主意!修改 tab[i][x] 现在会调用未定义的行为。此外,您还泄漏了 newed 数组,仅比其分配低 4 行...
  • 如果tab[i]=(char*)temp.c_str(); 的意思是将temp 的内容复制到tab[i],那就不行了;你只是重新指向指针。您首先需要使用strncpy,或者更好的是std::string
  • Temp 是一个字符串对象。我使用 char 数组而不是字符串,因为它只是练习数组和指针的练习。如何以其他方式将 c-string 分配给 char*?
  • 您的意思可能是 strcpy(tab[i], temp.c_str()); 。正如您所拥有的,tab[i] 指向内部管理的 temp 字符串,因此稍后当您重新分配 temp(下一次循环迭代)时,前一个 tab[i] 将成为悬空指针

标签: c++ stringstream ostringstream


【解决方案1】:

拿了一堆cmet并合并(为什么评论员不回答?):

您实际上正在做的是将tab[i] 的指针值从分配的内存更改为temp 的内部字符串。这是个坏主意,因为temp 会在内存被破坏后立即释放它。

据我所知,您根本不需要temp

解决这个问题的 C 方法是使用strcpy(tab[i], oss.str().c_str()),它将一个一个地复制字符。请注意,您当前的代码执行new char[80],因此如果您的字符串长度超过 79 个字符,它将溢出。如果您必须使用 new'd 缓冲区,请使用 new char[oss.str().size() + 1] 之类的东西

解决此问题的 C++ 方法是使用 std::string 数组而不是 char* 数组。然后你可以分配,比如tab[i] = oss.str(),它会正确复制它。当数组超出范围时,它还会清理使用的内存,因为您的代码现在没有这样做。

【讨论】:

    猜你喜欢
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多