В программе есть код: Код (Text): char* buffer = new char[256]; strnset(buffer,0,256); for(UINT z=0;z<=256;++z) { buffer[z] = 'T'; MessageBox(0,buffer,"ok",MB_OK); } MessageBox используется для просмотра содержимого buffer.В Debug MessageBox выдает: T TT TTT TTTT TTTTT и т.д. В Release: T TT TTT TTTT*** TTTTT** TTTTTT* TTTTTTT где * это посторонние символы.Компилятор Visual Studio 6.0.В чем может быть дело?Откуда появляются посторонние символы.Такое впечатление будто память выделяется не непрерывно в Release.
точно не помню, но по-моему в данном случае компилятор с генерирует код, который будет копировать содержимое буфера во временную область памяти. проблемы с ней. попробуйте что ли поставить & перед буфером в вызове messagebox
Выдает ошибку,ну и правильно buffer это и есть указатель.Интересно что если перенести этот код в чистую программу то все работает хорошо как в Debug так и в Release.
тогда логично предположить, что тут глюки с выделением памяти через new попробуй те спросит память у системы (HeapAlloc, GlobalAlloc, VirtualAlloc)
В 9й студии тот же эффект, хотел глянуть под Олей - но под ней он исчезает Глюк в strnset(buffer,0,256); её замена на for(UINT z=0;z<=256;++z) buffer[z] = 0; помогает.
Я бы сказал, что лучше заменить на memset. Проблема в том, что strnset строковая функция, а значит найдя ноль она остановится.
Использовать GUI для вывода отладочных сообщений дурной тон, это может доставить массу проблем, заюзой DbgPrint() и подобное.
AsmGuru62 +1 Код: char* buffer = new char[256]; strnset(buffer,0,256); for(UINT z=0;z<256;++z) { buffer[z] = 'T'; MessageBox(0,buffer,"ok",MB_OK); }
В дебаг режиме после new char[256] память которая выделяется не будет заполнена нолями. Раньше это использовалось как антиотладка в первых версиях аспра. Поэтому в дебаге надо самому очищать выделеную памят.
PaCHER не вводи народ в заблуждение - очищать нужно всегда (за исключением самостоятельного использования HeapAlloc(HEAP_ZERO_MEMORY), VirtualAlloc). В этом примере как раз в release память не чистилась.
В дебаге вся выделеная память заполняется 0xCC, а в релизе мусор. вот и strnset работает поразному. а последний аргумент (256) видимо максимальное количество возможных символов, но при первом 0x0 она заканчивает.
Чистить, не чистить... надо верно строку в памяти заканчивать. нулём. это повезло что цикл идёт на разворот, а не обратно, иначе бы ты хоть чисть перед циклом, хоть не чисть, получишь неверное. Кривая программа/алгоритм изначально.