Странности с new char[256] в Debug и Release

Тема в разделе "LANGS.C", создана пользователем KingT, 22 фев 2009.

  1. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    206
    В программе есть код:
    Код (Text):
    1.     char* buffer = new char[256];
    2.     strnset(buffer,0,256);
    3.  
    4.         for(UINT z=0;z<=256;++z)
    5.         {
    6.             buffer[z] = 'T';
    7.             MessageBox(0,buffer,"ok",MB_OK);
    8.         }
    MessageBox используется для просмотра содержимого buffer.В Debug MessageBox выдает:
    T
    TT
    TTT
    TTTT
    TTTTT
    и т.д.
    В Release:
    T
    TT
    TTT
    TTTT***
    TTTTT**
    TTTTTT*
    TTTTTTT

    где * это посторонние символы.Компилятор Visual Studio 6.0.В чем может быть дело?Откуда появляются посторонние символы.Такое впечатление будто память выделяется не непрерывно в Release.
     
  2. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    точно не помню, но по-моему в данном случае компилятор с генерирует код, который будет копировать содержимое буфера во временную область памяти. проблемы с ней. попробуйте что ли поставить & перед буфером в вызове messagebox
     
  3. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    206
    Выдает ошибку,ну и правильно buffer это и есть указатель.Интересно что если перенести этот код в чистую программу то все работает хорошо как в Debug так и в Release.
     
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    тогда логично предположить, что тут глюки с выделением памяти через new
    попробуй те спросит память у системы (HeapAlloc, GlobalAlloc, VirtualAlloc)
     
  5. int2e

    int2e New Member

    Публикаций:
    0
    Регистрация:
    9 янв 2009
    Сообщения:
    169
    Логичнее предположить, что ноль-терминатор затирается
    И отсюда глюки
     
  6. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    В 9й студии тот же эффект, хотел глянуть под Олей - но под ней он исчезает :)
    Глюк в strnset(buffer,0,256);
    её замена на for(UINT z=0;z<=256;++z) buffer[z] = 0; помогает.
     
  7. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Я бы сказал, что лучше заменить на memset. Проблема в том, что strnset строковая функция, а значит найдя ноль она остановится.
     
  8. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    206
    тоесть если я указал strnset(buffer,0,256) то для строки:****0***... она сделает:00000***...
     
  9. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    KingT
    Угу, строка-то закончилась.
     
  10. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Вообще-то максимальное значение индекса в этом случае - 255.
     
  11. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Использовать GUI для вывода отладочных сообщений дурной тон, это может доставить массу проблем, заюзой DbgPrint() и подобное.
     
  12. GHook

    GHook New Member

    Публикаций:
    0
    Регистрация:
    25 янв 2009
    Сообщения:
    9
    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);
    }
     
  13. KingT

    KingT Member

    Публикаций:
    0
    Регистрация:
    12 янв 2006
    Сообщения:
    206
    Да,очепятка
     
  14. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    В дебаг режиме после new char[256] память которая выделяется не будет заполнена нолями. Раньше это использовалось как антиотладка в первых версиях аспра. Поэтому в дебаге надо самому очищать выделеную памят.
     
  15. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    PaCHER
    не вводи народ в заблуждение - очищать нужно всегда (за исключением самостоятельного использования HeapAlloc(HEAP_ZERO_MEMORY), VirtualAlloc). В этом примере как раз в release память не чистилась.
     
  16. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    calloc чистит память.
     
  17. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    В дебаге вся выделеная память заполняется 0xCC, а в релизе мусор.
    вот и strnset работает поразному. а последний аргумент (256) видимо максимальное количество возможных символов, но при первом 0x0 она заканчивает.
     
  18. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    Чистить, не чистить... надо верно строку в памяти заканчивать. нулём. это повезло что цикл идёт на разворот, а не обратно, иначе бы ты хоть чисть перед циклом, хоть не чисть, получишь неверное. Кривая программа/алгоритм изначально.