Segfault со струнным потоком - PullRequest
3 голосов
/ 05 июля 2011

Это моя функция:

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 в виде строки безsegfault?

Точная функция

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 ]

4 голосов
/ 05 июля 2011

Это не работает

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

, когда GaugeWid не имеет размера.И он также не преобразует символы.

Если вам нужна широкая строка, используйте wstringstream.

2 голосов
/ 05 июля 2011

@ Бо заметил хорошую строку (после того, как вопрос был отредактирован ...). Я согласен.

Вот предложение исправить это:

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

@ kongr45gpen:

Я подозреваю ошибку в потоке:

  • вы делаете обновления имен переменных GaugeStr (звучит как мониторинг метра)
  • код нарушается при безобидном присвоении ....... глобальному.

Похоже на ошибку в потоке. Используете ли вы потоки, если это так, вы должны соответствующим образом заблокировать GaugeStr или сделать его локальным потоком.

Напишите мне, если мне нужно расширить их, потому что в настоящее время я не могу быть уверен, что вы используете многопоточность.

2 голосов
/ 05 июля 2011

Я только что попробовал:

#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).

...