C ++ stringstream to char *转换内存分配

时间:2013-03-28 12:51:34

标签: c++ arrays memory-management stringstream istringstream

任何人都可以解释以下代码是如何工作的并且会使应用程序崩溃吗?

int main() {
    char *tempStr = new char[5];
    tempStr[0] = '\0';
    string stemp = "helloworld";
    stringstream sstream;
    sstream.str(stemp);
    cout << "len before = " << strlen(tempStr);
    sstream >> tempStr;
    cout << "len after = " << strlen(tempStr) << endl;
    cout << tempStr << endl;
    delete[] tempStr;
    return 1;
}

我的输出为

len before = 0
len after = 10
helloworld
  1. stringstream是否为char指针中的额外字符分配内存?
  2. 还想知道将数据从stringstream复制到char *数组的正确方法,而不会超出为char*分配的内存?

2 个答案:

答案 0 :(得分:3)

  

stringstream是否为char指针中的额外字符分配内存?

没有。您的代码调用未定义的行为。

  

还想知道将数据从stringstream复制到char *数组的正确方法,而不超过为char *分配的内存?

阅读char*不是一个好主意。使用std::string从流中读取输入。但是,如果你仍然想知道为了知识,请使用std::istream::read()

if ( sstream.read(tempStr, 5 ) )
{
   //read succeeded
}

顺便说一下,你可以合并这两行:

stringstream sstream;
sstream.str(stemp);

成一个:

stringstream sstream(stemp);

或者只是这个:

stringstream sstream("helloworld"); //no need of stemp!

希望有所帮助。

答案 1 :(得分:1)

  1. 否。你覆盖了内存,调用了未定义的行为,但没有发生任何明显的事情,因此错误被忽视了。没有要求做这样的事情应该触发任何类型的人为可见错误或特殊操作,因此措辞未定义的行为
  2. 您将不得不按块执行此操作,并在char数组空间不足时重新分配它。在C ++中,手动执行此操作几乎没有意义。只需使用std::string即可完成。