2013-08-19 4 views
0

У меня есть простой gui с текстовым полем, выпадающим меню и кнопкой go. Я могу указать имя и класс части, которую я ищу, и вызвать функцию, подключив кнопку «идти» к слоту, в котором выполняется функция, которую я уже сделал.Функция Qt C++ прерывает удаление неизвестной переменной

Однако, когда функция слота выполняется со всем, она вызывает функцию в xstring, это удаление некоторых массивных xstring. Он идет к этой функции:

void _Tidy(bool _Built = false, 
    size_type _Newsize = 0) 
    { // initialize buffer, deallocating any storage 
    if (!_Built) 
     ; 
    else if (this->_BUF_SIZE <= this->_Myres) 
     { // copy any leftovers to small buffer and deallocate 
     pointer _Ptr = this->_Bx._Ptr; 
     this->_Getal().destroy(&this->_Bx._Ptr); 
     if (0 < _Newsize) 
      _Traits::copy(this->_Bx._Buf, 
       _STD addressof(*_Ptr), _Newsize); 
     this->_Getal().deallocate(_Ptr, this->_Myres + 1); 
     } 
    this->_Myres = this->_BUF_SIZE - 1; 
    _Eos(_Newsize); 
} 

И моя программа выполняет перерыв в this->_Getal().deallocate(_Ptr, this->_Myres + 1);.

Вот код для графического интерфейса:

#include <QtGui> 
#include <QApplication> 
#include <QComboBox> 
#include "gui.h" 
#include <vector> 

std::vector<std::string> PartClasses; 

gui::gui(QWidget *parent) : QDialog(parent){ 

    getPartClasses(PartClasses); //my own function, does not affect how the gui runs, just puts strings in PartClasses 

    label1 = new QLabel(tr("Insert Name (Optional):")); 
    label2 = new QLabel(tr("Class Name (Required):")); 
    lineEdit = new QLineEdit; 

    goButton = new QPushButton(tr("&Go")); 
    goButton->setDefault(true); 
    connect(goButton, SIGNAL(clicked()), this, SLOT(on_go_clicked())); 

    cb = new QComboBox(); 
    for(int i = 0; i < PartClasses.size(); i++) 
     cb->addItem(QString::fromStdString(PartClasses[i])); 

    //*add widgets to layouts, removed for space* 

    setWindowTitle(tr("TEST")); 
    setFixedHeight(sizeHint().height()); 
} 

void gui::on_go_clicked(){ 
    std::string str(cb->currentText().toStdString()); 
    updateDB(str, lineEdit->text().toUtf8().constData()); //my function, does not affect the gui. 
    QApplication::exit(); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication app(argc, argv); 
    gui *stuff = new gui; 
    stuff->show(); 
    return app.exec(); 
} 

Что он делает? Когда я закончил с слотом, не следует ли возвращать gui, чтобы я мог указать новый объект? Как я могу получить его, чтобы не удалить этот объект или добиться успеха?

+3

Похоже, что у вас есть сбой в вашей программе, который полностью не связан с сигналами и слотами. – Chris

+0

Я просто попробовал добавить 'QApplication :: exit()' после вызова моей функции в 'on_go_clicked()', и он выполняет quit, но gui не закрывается, и программа все еще ломается. –

+0

Крис, ничего не должно происходить в моей программе после запуска функции. Я написал gui без функций, и это сработало. Я написал функцию без gui, и она работает. Я поместил функцию в gui, и она вызывает функцию, заканчивается и возвращается в gui, но затем сработает, когда функция слота заканчивается. –

ответ

0

Вот моя догадка, что происходит:

Объекта, который вы обращаетесь становятся удаляются куда-то, где он не должен.

Эта функция _Tidy выглядит как очистка после манипуляции с строкой. Скорее всего, константа вашего char * не уменьшилась, и вы удаляете указатель const.

Чтобы исправить это, я бы сделал глубокую копию вашей переменной и передал ее в ваш updateDB, который делает вещи xstring LaTex. Или вы можете создать объект xstring прямо тогда и там и передать его.

Я также хотел бы использовать strcpy или что-то подобное, или, может быть, просто std::string.

Также может оказаться полезным код аварии, который выходит.

EDIT:

Вот что ваш код должен, вероятно, выглядеть ...

void gui::on_go_clicked(){ 
    std::string str(cb->currentText().toStdString()); 
    std::string line_edit_str(lineEdit->text().toUtf8().constData()); 

    updateDB(str, line_edit_str); //my function, does not affect the gui. 
    QApplication::exit(); 
} 

Надежда, что помогает.

+0

По какой-то причине это было потому, что я использовал 'toStdString()' вместо '.toUtf8(). ConstData()'. Я ненавижу, что по какой-то причине он не позволит мне использовать обычный способ. –

+0

QString чрезвычайно эффективен и может обрабатывать все сумасшествие локализации в стандартах UTF, Wide Character и интернет.Если вы поместите переменную в локальную переменную с областью, у вас не должно быть проблемы, но если вы перейдете в неизменяемый элемент const вниз, вы просите о проблемах. http://stackoverflow.com/questions/4214369/how-to-convert-qstring-to-stdstring – phyatt

+0

http://stackoverflow.com/questions/12495226/immutable-object-in-collections-c-and-qt – phyatt

Смежные вопросы