2012-05-11 18 views
0

我的代码如下执行名为.str()c_str()操作转储

std::ostringstream tmpstr, tmpstr2; 
for(/* something */) 
{ 
    //writting inside tmpstr 
} 

tmpstr2 << tmpstr.rdbuf(); 
cout << "assigned to tmpstr2"; 
out <<tmpstr2.str().c_str() ; // Where out is ostrstream& out 

这是转储最后一叠电话: -

std::basic_ostringstream<char,std::char_traits<char>,std::allocator<char> >::~basic_ostringstream

这最后一行时执行给我一个核心转储。我无法理解它背后的原因。如果我正在执行的操作是invalid,但是不是汇编错误,有人可以告诉我吗?

+3

可能问题出在您未显示的代码中。 –

+2

'.c_str()'在任何情况下都不是必需的。 – Jon

+3

它不应该很难创建一个最小的可编译的测试用例,为其他人体验相同的行为... – PlasmaHH

回答

1

你用另一条语句破坏了你的记忆。没有看到实际的代码很难猜测,但最好的猜测是你在tmpstr或堆栈数组之前分配的东西写出来之后。

无论哪种方式,实际上应该属于流对象的内存都会被覆盖,导致流对象中断。核心转储发生在实际的虚线之后,因为它没有被检测到。你写了一些界限,但最终在程序的内存中,而不是外部。特别是在tmpstr的记忆中。

+0

can a在tmpstr.str()后面的tmpstr执行'rdbuf'操作,c_str()'是合法的。 – Invictus

+0

是的,这是合法的。我认为在一些与“tmpstr”无关的代码中必须有一个错误 –