2016-12-01 7 views
1

私はこの方法を持っています。しかし、このメソッドにはメモリリークがあり、どこにあるのかわかりません。場合、メモリリークが(オブジェクトをシリアル化)

誰でも見つけられるでしょうか?

+3

なぜこのメソッドにメモリリークがあるとお考えですか?どう思う? –

+1

このメソッドを終了するときにGCで処理できないものはここには表示されません。だから、なぜメモリリークがあると思いますか? – HimBromBeere

+0

このメソッドを使用して1つのオブジェクトを10000回シリアル化すると、プログラムによって使用されるメモリが最大100MB(10MBから)になります。 – Lasoty

答えて

-1

C#ガベージコレクタはDispose()メソッドを持つオブジェクトに対しては実行しないため、Dispose()メソッドを使用してメモリからリソースを解放する必要があります。

public static string XmlSerialize<T>(T data) 
{ 
string result; 
using (StringWriter stringWriter = new StringWriter()) 
{ 
    XmlWriterSettings settings = new XmlWriterSettings 
    { 
     Encoding = Encoding.UTF8, 
     OmitXmlDeclaration = true, 
    }; 
    using (XmlWriter writer = XmlWriter.Create(stringWriter, settings)) 
    { 
     XmlSerializerNamespaces ns = new XmlSerializerNamespaces(); 
     ns.Add("", ""); 
     XmlSerializer serializer = XmlSerializer.FromTypes(new[] { typeof(T) })[0]; 
     serializer.Serialize(writer, data, ns); 
     if (writer != null) 
      writer.Dispose(); 
    } 
    result = stringWriter.ToString(); 
    if (stringWriter != null) 
     stringWriter.Dispose(); 
} 

return result; 
} 
+0

"USING"の使用が解決しないことはありますか? – Lasoty

+1

"using"ブロックの最後にDisposeが自動的に呼び出されます。 –

+1

これは間違っています。スコープを離れると、使用ブロックはオブジェクトに対して 'Dispose'を呼び出します。また、例外がスローされても、一般にDisposeを呼び出すので安全です。 – TheLethalCoder

関連する問題