Почему в данном фрагменте кода происходит memory leak?

Рейтинг: 0Ответов: 1Опубликовано: 20.02.2023

Почему в данном фрагменте кода происходи memory leak?

Насколько я понимаю, то берётся копия потока, над ней выполняются операции, а затем в памяти "оригинальный поток" заменяется копией?

protected virtual Stream RenderXhtml(Stream inputDocumentStream, IFormatType styleSheetInfo)
    {
        var docReader = XmlReader.Create(inputDocumentStream);

        var xhtmlStream = styleSheetInfo.TransformXmlDoc(docReader, this.BuildTransformParam());

        inputDocumentStream.Seek(0, SeekOrigin.Begin);
        xhtmlStream.Seek(0, SeekOrigin.Begin);
    
        CreateFileDump(xhtmlStream, ".html");

        xhtmlStream = TableConverter.ConvertTablesToImages(xhtmlStream, publicationName);

        return xhtmlStream;
    }

Ответы

▲ 1Принят

Здесь пару потоков лишних задиспозить не мешало бы.

Использование объектов, реализующих IDisposable

protected virtual Stream RenderXhtml(Stream inputDocumentStream, IFormatType styleSheetInfo)
{
    inputDocumentStream.Seek(0, SeekOrigin.Begin);
    using var docReader = XmlReader.Create(inputDocumentStream);
    using var xhtmlStream = styleSheetInfo.TransformXmlDoc(docReader, this.BuildTransformParam());

    CreateFileDump(xhtmlStream, ".html");
    xhtmlStream.Seek(0, SeekOrigin.Begin);

    return TableConverter.ConvertTablesToImages(xhtmlStream, publicationName);
}

Но вообще точное решение очень сильно зависит от поведения вызываемых методов. Например неизвестно, у ConvertTablesToImages жадное поведение или ленивое. Во втором случае диспозить созданные потоки нельзя, их должен закрывать сам метод ConvertTablesToImages по окончании использования, либо у него должен был аргумент, отвечающий за управление таким поведением.