Сравните эти два фрагмента:Почему этот TStreamAdapter не выпущен?
(d as IPersistStream).Save(
TStreamAdapter.Create(
TFileStream.Create('test.bin',fmCreate),soOwned),true);
(d as IPersistStream).Load(
TStreamAdapter.Create(
TFileStream.Create('test.bin',fmOpenRead),soOwned));
Это терпит неудачу на втором TFileStream.Create
, потому что первый не разрушается. Это странно, так как параметр имеет единственную ссылку, я думал, что он будет уничтожен при закрытии вызова Save
. Поэтому я пробовал это:
var
x:IStream;
begin
x:=TStreamAdapter.Create(
TFileStream.Create('test.bin',fmCreate),soOwned);
(d as IPersistStream).Save(x,true);
x:=nil;
x:=TStreamAdapter.Create(
TFileStream.Create('test.bin',fmOpenRead),soOwned);
(d as IPersistStream).Load(x);
x:=nil;
Который работает нормально. (Но снова сработает без x:=nil;
) Так что не волнуйтесь о d
, это is a IPersistStream
и ведет себя правильно. Почему для принудительного вызова _Release
требуется явное назначение nil
? Это проблема с Delphi 7? Это из-за переключателя компоновщика/компилятора?
Было бы действительно очень легко сделать SSCCE. Теперь я должен это сделать. И так есть кто-то еще, кто хочет запустить код. На самом деле, я не уверен, что меня даже могут беспокоить. Не могли бы вы это сделать? На самом деле, я знаю ответ, ничего не работая. Тебе повезло! –
Смотрите, я узнаю что-то новое и неожиданное с каждым вопросом, который я задал. Не знал о SSCCE. Мой на основе https://github.com/stijnsanders/TMongoWire/blob/master/bsonDoc.pas см. Здесь https://gist.github.com/stijnsanders/9960826 –
Я добавил SSCCE к моему ответу. –