Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Почему происходит утечка памяти


Автор: yngwie19 18.12.2008, 11:18
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;
    }

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

Автор: yngwie19 18.12.2008, 12:33
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;
    }

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

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;

Автор: mekhanikus 18.12.2008, 12:54
В случае

Код

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));

Автор: Rififi 18.12.2008, 13:38
TCHAR szTextх[128][2];
гы. (((:

Автор: yngwie19 18.12.2008, 14:11
Цитата

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


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

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

 smile 

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

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

TCHAR szTextх[2][128];

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


Автор: Andrey44 19.12.2008, 08:36
Цитата(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 

Автор: yngwie19 19.12.2008, 09:26
Скажите в выражении
Код

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

и
Код

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


_T для чего используется ?

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

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

а причем тогда _T ?

Автор: Andrey44 19.12.2008, 16:20
Модератор: Сообщение скрыто.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)