带有stringstream的Segfault

时间:2011-07-05 10:34:13

标签: c++ string segmentation-fault

这是我的功能:

string GaugeStr;
void someFunction() {
    float pie = someFloat();
    stringstream ss (stringstream::in | stringstream::out);
    ss << pie;
    GaugeStr = ss.str();
}

当我运行该功能时,它可以正常工作。当我第二次调用它时someFunction(); someFunction();,然后我的程序崩溃并出现分段错误。

我尝试将stringstream ss (stringstream::in | stringstream::out);从函数中移出以使其成为全局变量,但我要发送到GaugeStr的内容会附加到ss。例如,如果我们假设someFloat()始终返回1.2,那么第二次运行该函数时,GaugeStr将设置为1.21.2

所以,我在函数中插入了ss.str(""),但程序再次崩溃了。

如果将someFloat()的值GaugeStr作为字符串而没有段错误,我该怎么办?

精确功能

void CPU_BenchmarkFrame::OnButton1Click(wxCommandEvent& event) {
    float pie = PiAlgo (Gauge2);
    stringstream ss (stringstream::in | stringstream::out);
    ss << pie;
    wxMessageBox(_("Alert"), _("Sample Alert")); //To test where the segfault happens
    string GaugeStr = ss.str();

    wstring GaugeWid;
    std::copy(GaugeStr.begin(), GaugeStr.end(), GaugeWid.begin());

    StaticText2->SetLabel(GaugeWid);
}

更多编辑

问题是这里有一行或多行:

    wstring GaugeWid;
    std::copy(GaugeStr.begin(), GaugeStr.end(), GaugeWid.begin());

    StaticText2->SetLabel(GaugeWid);

当我评论它们时,脚本正常工作。

3 个答案:

答案 0 :(得分:4)

这不起作用

std::wstring GaugeWid;
std::copy(GaugeStr.begin(), GaugeStr.end(), GaugeWid.begin());
GaugeWid没有大小时

并且它也不会转换字符。

如果您想要一个宽字符串,请使用wstringstream

答案 1 :(得分:2)

我刚尝试过:

#include <iostream>
#include <sstream>

using namespace std;

string GaugeStr;

float someFloat() {  
   return (float) 3.41; 
}

void someFunction() {

    float pie = someFloat();
    stringstream ss (stringstream::in | stringstream::out);
    ss << pie;
    GaugeStr = ss.str(); 
}

int main() {    
   someFunction();    
   someFunction();

   return 0; 
}

使用gcc-compiler版本4.4.0(在Windows上运行,IDE:CodeBlocks)进行编译。

答案 2 :(得分:2)

@Bo发现一条好线(问题被编辑后......)。我同意。

以下是修复它的建议:

GaugeWid.clear();
std::copy(GaugeStr.begin(), GaugeStr.end(), std::back_inserter(GaugeWid));

@ kongr45gpen:

我怀疑是一个线程错误:

  • 您正在更新变量名称GaugeStr(听起来像仪表监控)
  • 代码打破无害的任务.......一个全球性的。

听起来像是线程错误。你是否使用线程,如果是这样,你必须适当地锁定GaugeStr或使其成为本地线程。

如果我需要扩展这些内容,请给我留言,因为目前我无法确定您是否使用了线程。