Утечка памяти в TDictionary - проблемы с обходным решением? - PullRequest
3 голосов
/ 04 февраля 2009

Я только что подумал об использовании нового типа TDictionary. Но на QualityCentral я прочитал о двух утечках памяти, вызванных TDictionary:

http://qc.codegear.com/wc/qcmain.aspx?d=67355

Я только что реализовал предложенный обходной путь, в основном подклассы TDictionary, переопределяя деструктор и вручную освобождая два объекта, которые вызывают утечку:

destructor TMemCorrectedDictionary.Destroy;
begin
  Values.Free;
  Keys.Free;
  inherited;
end;

Проблема в том, что Values ​​и Keys доступны только для чтения свойств TDictionary, я не могу установить для них значение nil. Ну, для ясности, теперь все работает нормально, но я подумал, что произойдет, если CodeGear выпустит патч для утечки и снова освободит два объекта в их собственном деструкторе. Не приведет ли это к нарушению доступа?

Заранее спасибо за прочтение (и, надеюсь, за ответ).

Ответы [ 2 ]

2 голосов
/ 04 февраля 2009

Вы можете сначала позвонить inherited и проверить, установлены ли свойства по-прежнему:

destructor TMemCorrectedDictionary.Destroy;
begin
  inherited;
  Values.Free;
  Keys.Free;
end;

И, кстати: Free не волнует, является ли экземпляр, который должен быть освобожден, nil, поэтому это будет работать, если (но только если) inherited Destroy установит свойства в nil.

0 голосов
/ 27 февраля 2014

Я не знаю, как насчет предыдущих версий Delphi, но в XE5 есть класс TObjectDictionary, который занимается освобождением всех подэлементов.

...