【问题标题】:Segfault with stringstream带有字符串流的段错误
【发布时间】:2011-07-05 10:34:13
【问题描述】:

这是我的功能:

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);

当我评论它们时,脚本运行正常。

【问题讨论】:

  • 你能用main()发布一段导致段错误的完整代码吗?
  • 这看起来不错。您没有显示的代码有问题。
  • 段错误的确切来源是什么?堆栈跟踪会很好......
  • 与问题无关,但您的构造函数参数是多余的 - 将其关闭(in | out 已经是默认值)。
  • @kongr 没有调试符号和上下文的堆栈跟踪完全是零使用。所有这些都告诉我们错误是……somewhere(更准确地说,在标记为?? 的位置)。请提供一个说明问题的最小工作示例。

标签: c++ string segmentation-fault


【解决方案1】:

这行不通

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

GaugeWid 没有大小时。而且它也不转换字符。

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

【讨论】:

  • 没错。问题是我如何设置一个,这样程序就可以在没有段错误的情况下运行。
  • 我在回答中提出了建议
【解决方案2】:

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

这里有一个修复它的建议:

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

@kongr45gpen:

我怀疑是线程错误:

  • 您正在更新变量名称 GaugeStr(听起来像仪表监控)
  • 代码在无害分配给.......全局时中断。

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

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

【讨论】:

    【解决方案3】:

    我刚试过:

    #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 编译器版本 4.4.0 编译(在 Windows 上运行,IDE:CodeBlocks)。

    【讨论】:

    • 它是here now (codepad),所以你可以编辑它并观看它运行:)
    • @sehe 我知道,我自己尝试过,它有效,但在我的项目中不起作用。
    • @kongr45gpen:很高兴知道你知道。又是什么问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    相关资源
    最近更新 更多