Как я могу зарегистрировать ExpectMemoryLeak для TCriticalSection - PullRequest
0 голосов
/ 08 ноября 2011

Это может быть просто. Как я могу зарегистрировать memleak для TCriticalSection с Indy9 в D2007? Я нашел это , но без примера.

EDIT: Спасибо Реми за ответ, но у меня это не сработало. В каталоге Indy9 я меняю IdComponent.pas с

initialization
  GStackCriticalSection := TCriticalSection.Create;
finalization
  // Dont Free. If shutdown is from another Init section, it can cause GPF when stack
  // tries to access it. App will kill it off anyways, so just let it leak
  // FreeAndNil(GStackCriticalSection);

до

initialization
  GStackCriticalSection := TCriticalSection.Create;
  RegisterExpectedMemoryLeak(GStackCriticalSection);
finalization
  // Dont Free. If shutdown is from another Init section, it can cause GPF when stack
  // tries to access it. App will kill it off anyways, so just let it leak
  // FreeAndNil(GStackCriticalSection);

Та же утечка, что и раньше. Я мог бы установить точку останова на TCriticalSection.Create, чтобы я знал, что код на самом деле выполняется. Но странная вещь заключается в том, что если я установлю точку останова на RegisterMpectedMemoryLeak FastMM, она никогда не будет достигнута.

1 Ответ

1 голос
/ 08 ноября 2011

Просто передайте указатель объекта TCriticalSection на RegisterExpectedMemoryLeak(), как и любой другой параметр, например:

var
  CS: TCriticalSection;
...
RegisterExpectedMemoryLeak(CS);

Просто убедитесь, что TCriticalSection был создан, прежде чем зарегистрировать его.

Или вы можете перейти на Indy 10, которая уже регистрирует свои преднамеренные утечки (или вы можете определить FREE_ON_FINAL в IdCompilerDefines.inc, чтобы отключить утечки - прочитайте комментарии внизу IdStack.pas и IdThread. па, прежде чем сделать это).

...