Russian Qt Forum
Май 08, 2024, 10:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Ошибка в отладке и нормальная работа при простом запуске программы  (Прочитано 2805 раз)
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", либо пустую строку, либо вообще не понятный мусор, либо падает с сегментацией памяти, а точнее все подряд в разном порядке.
В чем может быть проблема, подскажите будьте добры.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Ноябрь 10, 2011, 12:43 »

присваивать сишные строки через = - плохо вообще говоря. вот std::string или QString - другое дело.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Ноябрь 10, 2011, 14:20 »

Господа знатоки подскажите в чем может быть проблема.
Код:
	_Message = Message;
};
Не надо быть знатоком, это копирование адреса, а не содержимого. Напр если входной Message объявлен как
Код
C++ (Qt)
const char * txt1 = "My Message";
 
то все Ok. А вот если он создается и затем удаляется - то _Message будет указывать на мусор который остался   
Записан
helsq
Гость
« Ответ #3 : Ноябрь 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"?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #4 : Ноябрь 10, 2011, 18:33 »

workersmsg - да, после функции, а "work" - после выхода из конструктора
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Ноябрь 10, 2011, 19:47 »

А вот если он вот так используется test(workersmsg(0, "work")), когда разрушается экземпляр workersmsg? После того как отработает функция? Тогда почему разрушается "work"?
Так "work" должен жить forever. Не знаю, может причина в другом
Записан
helsq
Гость
« Ответ #6 : Ноябрь 11, 2011, 06:54 »

Спасибо за помощь. В общем, я получил ответы на интересующие меня вопросы, кроме одного - откуда разница в работе программы при запуске через ctrl-r (запуск) и F5 (отладка), так ведь можно напороться на грабли, которые наоборот будут возникать в рабочем режиме и не возникать в отладке или я зря паникую?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.082 секунд. Запросов: 22.