Вобщем блок из кучи освобождается нормально, если не вызывалась эта функция. После ее вызова вызов HeapFree выбразывает окно с уведомлением о разрушении кучи. Я думаю что проблема в RtlCopyMemory, но с чем это связано не понимаю. Помогите. Может кто сталкивался с такой проблемой? Код (Text): class CUnicodeStringStorage { private: PWCHAR *_storage; DWORD _index; public: //... Код (Text): void CUnicodeStringStorage::ExtendString(DWORD index, PWCHAR _str, DWORD n_size) { size_t size; if(index>_index-1) return; size = wcslen(_storage[index]); _storage[index] = (PWCHAR)HeapReAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, (LPVOID)_storage[index], sizeof(WCHAR)*size+n_size); RtlCopyMemory(_storage[index]+size, _str, sizeof(WCHAR)*(size)+n_size); } Вот код который собственно пытается осводить память после использования. Код (Text): CUnicodeStringStorage::~CUnicodeStringStorage() { for(DWORD i=0; i<_index; i++) HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, (LPVOID)_storage[i]);//здесь вылетает HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE, (LPVOID)_storage); } Ошибка выглядит так:: Спасибо.
1. ApplicationVerifier 2. Обвертки вокруг функций выделения/освобождения памяти для учета что и как 3. средства crt http://www.rsdn.ru/?article/?vcpp/leaks.xml
Скорее всего, проблема в n_size. Каков смысл этого параметра? Это число WCHARs или число байтов? Кроме того, где место под '\0' (тоже WCHAR) в конце строки?
n_size - это длина в байтах. место под 0 выделено. так как например для строки "123" расширенной "4567" до "1234567" в результате выделяется 16 байт в чем же бок?
UTeX В смысле basic_string не являются потокобезопасными функциями, а стало быть обращаться ними нужно аккуратно и почитать надо мсдн касательно этих строк
а еще стд-стринги текут если не накатить сп1 на студию 2005 для траха с хипами очень рекомендую gflags.exe - рулит неподецки
z0mailbox Кстати как обстоят дела с вистой и gflags.exe а конкретнее с kernel flags и enable object handle type tagging
Код (Text): void CUnicodeStringStorage::ExtendString(DWORD index, PWCHAR _str, DWORD n_size) { size_t size; if(index>_index-1) return; size = wcslen(_storage[index]); _storage[index] = (PWCHAR)HeapReAlloc(GetProcessHeap(), HEAP_NO_SERIALIZE, (LPVOID)_storage[index], size+n_size+1); for(DWORD j = 0; j<n_size+1; j++) *(_storage[index]+size+j)=_str[j]; } заменил RtlCopyMemory - ошибка осталась.