Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Aby użyć kompilacji debugowania w celu sprawdzenia nadpisywania pamięci, należy najpierw ponownie skompilować projekt na potrzeby debugowania. Następnie przejdź do samego początku funkcji aplikacji InitInstance
i dodaj następujący wiersz:
afxMemDF |= checkAlwaysMemDF;
Alokator pamięci debugowania umieszcza bajty ochrony wokół wszystkich alokacji pamięci. Jednak te bajty ochrony nie wykonują żadnych dobrych czynności, chyba że sprawdzisz, czy zostały zmienione (co oznaczałoby zastąpienie pamięci). W przeciwnym razie zapewnia to tylko bufor, który może w rzeczywistości pozwolić uciec z zastępowania pamięci.
Włączając element checkAlwaysMemDF
, wymusisz wywołanie funkcji przez MFC za każdym razem, gdy zostanie wykonane wywołanie AfxCheckMemory
new
funkcji lub delete
. Jeśli wykryto zastąpienie pamięci, wygeneruje komunikat TRACE podobny do następującego:
Damage Occurred! Block=0x5533
Jeśli widzisz jeden z tych komunikatów, musisz przejść przez kod, aby określić, gdzie wystąpiły szkody. Aby dokładniej odizolować miejsce, w którym wystąpiło zastąpienie pamięci, możesz wykonać jawne wywołania do AfxCheckMemory
siebie. Na przykład:
ASSERT(AfxCheckMemory());
DoABunchOfStuff();
ASSERT(AfxCheckMemory());
Jeśli pierwsza funkcja ASSERT powiedzie się, a druga zakończy się niepowodzeniem, oznacza to, że zastąpienie pamięci musi mieć miejsce w funkcji między dwoma wywołaniami.
W zależności od charakteru aplikacji może się okazać, że afxMemDF
program działa zbyt wolno, aby nawet testować. Zmienna afxMemDF
powoduje AfxCheckMemory
wywołanie dla każdego wywołania nowego i usunięcia. W takim przypadku należy rozproszyć własne wywołania do AfxCheckMemory
( ), jak pokazano powyżej, i spróbować wyizolować pamięć w ten sposób.