Russian Qt Forum

Qt => Вопросы новичков => Тема начата: helsq от Ноябрь 10, 2011, 12:00



Название: Ошибка в отладке и нормальная работа при простом запуске программы
Отправлено: helsq от Ноябрь 10, 2011, 12:00
Господа знатоки подскажите в чем может быть проблема.
Есть следующий класс:
Код:
class workersmsg
{
const int* _MsgType;
const char* _Message;

public:

workersmsg(): _MsgType(0), _Message(""){}

workersmsg(const char* Message){
workersmsg(0, Message);
}

workersmsg(const int* Number,const char* Message){
_MsgType = Number;
_Message = Message;
}

workersmsg(const workersmsg &wm){
_MsgType = wm.MsgType();
_Message = wm.Message();
}

~workersmsg(){}
const char* Message() const {return _Message;}
const int*     MsgType() const   {return _MsgType;}

};

Вот так используется:

Код:
test(workersmsg(0, "work"));

Код:
void Widget::test(const workersmsg &wmsg){
QMessage::inforamtion(0, "", QMessageBox::information(0, "", wmsg.Message());
}

Если просто запустить все работает нормально. А в режиме отладки wmsg.Message() возвращает либо "work", либо пустую строку, либо вообще не понятный мусор, либо падает с сегментацией памяти, а точнее все подряд в разном порядке.
В чем может быть проблема, подскажите будьте добры.


Название: Re: Ошибка в отладке и нормальная работа при простом запуске программы
Отправлено: kambala от Ноябрь 10, 2011, 12:43
присваивать сишные строки через = - плохо вообще говоря. вот std::string или QString - другое дело.

если же хочешь все-таки пользоваться сишными, то сделай _Message неконстантной и вместо = делай strcpy (или qstrcpy). но тогда не нужно забывать об управлении памятью.


Название: Re: Ошибка в отладке и нормальная работа при простом запуске программы
Отправлено: Igors от Ноябрь 10, 2011, 14:20
Господа знатоки подскажите в чем может быть проблема.
Код:
	_Message = Message;
};
Не надо быть знатоком, это копирование адреса, а не содержимого. Напр если входной Message объявлен как
Код
C++ (Qt)
const char * txt1 = "My Message";
 
то все Ok. А вот если он создается и затем удаляется - то _Message будет указывать на мусор который остался   


Название: Re: Ошибка в отладке и нормальная работа при простом запуске программы
Отправлено: helsq от Ноябрь 10, 2011, 18:05
присваивать сишные строки через = - плохо вообще говоря. вот std::string или QString - другое дело.

если же хочешь все-таки пользоваться сишными, то сделай _Message неконстантной и вместо = делай strcpy (или qstrcpy). но тогда не нужно забывать об управлении памятью.

С самого начала думал на QString писать, так наверное и сделаю.

Не надо быть знатоком, это копирование адреса, а не содержимого. Напр если входной Message объявлен как
Код
C++ (Qt)
const char * txt1 = "My Message";
 
то все Ok. А вот если он создается и затем удаляется - то _Message будет указывать на мусор который остался   

А вот если он вот так используется test(workersmsg(0, "work")), когда разрушается экземпляр workersmsg? После того как отработает функция? Тогда почему разрушается "work"?


Название: Re: Ошибка в отладке и нормальная работа при простом запуске программы
Отправлено: kambala от Ноябрь 10, 2011, 18:33
workersmsg - да, после функции, а "work" - после выхода из конструктора


Название: Re: Ошибка в отладке и нормальная работа при простом запуске программы
Отправлено: Igors от Ноябрь 10, 2011, 19:47
А вот если он вот так используется test(workersmsg(0, "work")), когда разрушается экземпляр workersmsg? После того как отработает функция? Тогда почему разрушается "work"?
Так "work" должен жить forever. Не знаю, может причина в другом


Название: Re: Ошибка в отладке и нормальная работа при простом запуске программы
Отправлено: helsq от Ноябрь 11, 2011, 06:54
Спасибо за помощь. В общем, я получил ответы на интересующие меня вопросы, кроме одного - откуда разница в работе программы при запуске через ctrl-r (запуск) и F5 (отладка), так ведь можно напороться на грабли, которые наоборот будут возникать в рабочем режиме и не возникать в отладке или я зря паникую?