HeapFree(...)::RtlCopyMemory(...)::HEAP CORRUPTION

Тема в разделе "WASM.WIN32", создана пользователем UTeX, 13 ноя 2007.

Статус темы:
Закрыта.
  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Вобщем блок из кучи освобождается нормально, если не вызывалась эта функция.
    После ее вызова вызов HeapFree выбразывает окно с уведомлением о разрушении кучи.
    Я думаю что проблема в RtlCopyMemory, но с чем это связано не понимаю.
    Помогите. Может кто сталкивался с такой проблемой?

    Код (Text):
    1. class CUnicodeStringStorage
    2. {
    3. private:
    4.     PWCHAR *_storage;
    5.     DWORD _index;
    6. public:
    7.     //...
    Код (Text):
    1. void CUnicodeStringStorage::ExtendString(DWORD index, PWCHAR _str, DWORD n_size)
    2. {
    3.     size_t size;
    4.     if(index>_index-1) return;
    5.     size = wcslen(_storage[index]);
    6.     _storage[index] = (PWCHAR)HeapReAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, (LPVOID)_storage[index], sizeof(WCHAR)*size+n_size);
    7.     RtlCopyMemory(_storage[index]+size, _str, sizeof(WCHAR)*(size)+n_size);
    8. }
    Вот код который собственно пытается осводить память после использования.

    Код (Text):
    1. CUnicodeStringStorage::~CUnicodeStringStorage()
    2. {
    3.     for(DWORD i=0; i<_index; i++)
    4.         HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, (LPVOID)_storage[i]);//здесь вылетает
    5.     HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, (LPVOID)_storage);
    6. }
    Ошибка выглядит так::

    Спасибо.
     
  2. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    1. ApplicationVerifier
    2. Обвертки вокруг функций выделения/освобождения памяти для учета
    что и как
    3. средства crt http://www.rsdn.ru/?article/?vcpp/leaks.xml
     
  3. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    Скорее всего, проблема в n_size. Каков смысл этого параметра? Это число WCHARs или число байтов? Кроме того, где место под '\0' (тоже WCHAR) в конце строки?
     
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    std::wstring?
     
  5. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    censored
    А знает ли комраде UTeX что они топо это - не треадсейф?
     
  6. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    n_size - это длина в байтах. место под 0 выделено. так как например для строки "123" расширенной "4567" до "1234567" в результате выделяется 16 байт
    в чем же бок?
     
  7. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    В смысле?
     
  8. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    UTeX
    В смысле basic_string не являются потокобезопасными функциями, а стало быть
    обращаться ними нужно аккуратно и почитать надо мсдн касательно этих строк
     
  9. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    а еще стд-стринги текут если не накатить сп1 на студию 2005
    для траха с хипами очень рекомендую gflags.exe - рулит неподецки
     
  10. Cock

    Cock New Member

    Публикаций:
    0
    Регистрация:
    9 фев 2007
    Сообщения:
    148
    z0mailbox
    Кстати как обстоят дела с вистой и gflags.exe
    а конкретнее с kernel flags и enable object handle type tagging
     
  11. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Код (Text):
    1. void CUnicodeStringStorage::ExtendString(DWORD index, PWCHAR _str, DWORD n_size)
    2. {
    3.     size_t size;
    4.     if(index>_index-1) return;
    5.     size = wcslen(_storage[index]);
    6.     _storage[index] = (PWCHAR)HeapReAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, (LPVOID)_storage[index], size+n_size+1);
    7.     for(DWORD j = 0; j<n_size+1; j++)
    8.         *(_storage[index]+size+j)=_str[j];
    9. }
    заменил RtlCopyMemory - ошибка осталась.
     
  12. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    бред какой-то
     
  13. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
  14. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    (size+n_size+1)*sizeof(WCHAR)
    все. нашел где сбочил. тема закрыта
     
Статус темы:
Закрыта.