Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему происходит утечка памяти 
:(
    Опции темы
yngwie19
Дата 18.12.2008, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



int WINAPI WinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
    {
        
        char *szText[2];
        int value = 10;
        int number = 50;
        wsprintf(szText[0],"Значение value = %X",value);
        wsprintf(szText[1],"value=%#x...number=%d",value,number);
        
        MessageBox(NULL,szText[0], "szText[0]", MB_OK);
        MessageBox(NULL,szText[1], "szText[1]", MB_OK);
        
        return 0;
    }
PM MAIL   Вверх
Andrey44
Дата 18.12.2008, 12:02 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



И какие тут утечки памяти?
И кто будет выделять под char *szText[2]; память?
И пользуйтесь тэгом КОД


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 18.12.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Andrey44, 
Цитата(Andrey44 @  18.12.2008,  12:02 Найти цитируемый пост)
И какие тут утечки памяти?


у тебя прога после компиляции запускается?, у меня запускается с ошибкой "Прилодение будет закрыто"


Цитата(Andrey44 @  18.12.2008,  12:02 Найти цитируемый пост)
И кто будет выделять под char *szText[2]; память?


Во-первых зачем для него выделять память, это же стековый указател, который мы инициализиреум в функции wsprintf(). А во вторых у нас только есть szText[0] и szText[1]

Почему так работает:
Код

int WINAPI WinMain(HINSTANCE,HINSTANCE,LPTSTR,int)
    {
        char *szText[2] = {"Привет","Пока"};
                
        MessageBox(NULL,szText[0],"Массив1",MB_OK);
        MessageBox(NULL,szText[1],"Массив2",MB_OK);
        
        
        return 0;
    }


Это сообщение отредактировал(а) yngwie19 - 18.12.2008, 12:36
PM MAIL   Вверх
Andrey44
Дата 18.12.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Да-а-а, с такими знаниями языка вам прямая дорога в книжный магазин.
Я вообще удивляюсь как оно у вас компилится.
Код

TCHAR szTextх[128][2];
        int value = 10;
        int number = 50;
        wsprintf(szText[0],_T("Значение value = %X"),value);
        wsprintf(szText[1],_T("value=%#x...number=%d"),value,number);
        
        MessageBox(NULL,szText[0], _T("szText[0]"), MB_OK);
        MessageBox(NULL,szText[1], _T("szText[1]"), MB_OK);
        
        return 0;



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
mekhanikus
Дата 18.12.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

Репутация: 1
Всего: 1



В случае

Код

char *szText[2] = {"Привет","Пока"};


Указатели на char инициализируются адресами строк {"Привет","Пока"}

Если делать так

Код

char *szText[2];


Указатели остаются не инициализированы никак (содержат мусор),
и по команде wsprintf происходит попытка записи значений по произвольному адресу.

Чтобы заработало во втором случае, надо выделить память и желательно забить её нулями.
Например так

Код

szText[0] = new char[10];
szText[1] = new char[10];
memset(szText[0],0,10*sizeof(char));
memset(szText[1],0,10*sizeof(char));

PM MAIL   Вверх
Rififi
Дата 18.12.2008, 13:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 2
Всего: 36



TCHAR szTextх[128][2];
гы. (((:
PM MAIL   Вверх
yngwie19
Дата 18.12.2008, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата

Я вообще удивляюсь как оно у вас компилится.


Да все нормально, объясните пожалуйста использование _T, Я что-то слышал про MessageBoxA и MessageBoxB это то?

Это сообщение отредактировал(а) yngwie19 - 18.12.2008, 17:33
PM MAIL   Вверх
Andrey44
Дата 18.12.2008, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Цитата(Rififi @  18.12.2008,  13:38 Найти цитируемый пост)
TCHAR szTextх[128][2];
гы. (((: 

 smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
GremlinProg
Дата 18.12.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(Andrey44 @  18.12.2008,  14:47 Найти цитируемый пост)
TCHAR szTextх[128][2];

Andrey44, наверное, хотел написать
Код

TCHAR szTextх[2][128];

к чему для 2-х строк 128  2-х символьных массивов )




--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Andrey44
Дата 19.12.2008, 08:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



Цитата(GremlinProg @  18.12.2008,  18:21 Найти цитируемый пост)
Цитата(Andrey44 @  18.12.2008,  14:47 Найти цитируемый пост)
TCHAR szTextх[128][2];

Andrey44, наверное, хотел написать
Выделить всёкод C++
1:
    
TCHAR szTextх[2][128];

к чему для 2-х строк 128  2-х символьных массивов )

Именно это и хотел smile 


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 19.12.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Скажите в выражении
Код

 wsprintf(szText[0],_T("Значение value = %X"),value);

и
Код

MessageBox(NULL,szText[0], _T("szText[0]"), MB_OK);


_T для чего используется ?
PM MAIL   Вверх
Andrey44
Дата 19.12.2008, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26



_T("text") - это макрос который определяет проект собран в юникоде или нет.
Если да - то перед строкой подставляется L"text" иначе просто "text"


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yngwie19
Дата 19.12.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 15.6.2008
Где: Новгород

Репутация: нет
Всего: нет



Цитата(Andrey44 @  19.12.2008,  09:39 Найти цитируемый пост)
иначе просто "text"

а причем тогда _T ?
PM MAIL   Вверх
Andrey44
Дата 19.12.2008, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 8
Всего: 26




Модератор: Сообщение скрыто.



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0680 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.