日期:2014-05-20  浏览次数:20782 次

.NET 托管内存泄露?!……
同志们,我发现了一个托管内存泄露的问题 而不是传统的非托管内存 见代码:
// tempExe.cpp: 主项目文件。

#include "stdafx.h"

using namespace System;
using namespace System::IO;

ref class ClassB;
public ref class ClassA
{
public:
StreamWriter^ w;
ClassB^ b;
ClassA(ClassB^ b_l)
{
b=b_l;
w= gcnew StreamWriter("xx.txt");
}
~ClassA()
{
w->WriteLine("Close ok!");
w->Close();
}
};
public ref class ClassB
{
public:
ClassA^ a;
ClassB()
{
a= gcnew ClassA(this);
}
};
public ref class ClassC
{
public:
StreamWriter^ w;
ClassC()
{
w= gcnew StreamWriter("xx.txt");
}
~ClassC()
{
w->WriteLine("Close ok!");
w->Close();
}
};


int main(array<System::String ^> ^args)
{
  Console::WriteLine(L"Hello World");
ClassB^ b=gcnew ClassB();
Console::WriteLine("please put any thing");
Console::ReadLine();
delete b;
b=nullptr;
Console::WriteLine("stop pause");
Console::ReadLine();
  return 0;
}
(我是C++ c#们将就一下吧……)

当我用c类(对照组)实验时 在第一次暂停时xx.txt无法正常访问 而当第二次暂停时 C类成功的释放,xx.txt中显示“close ok!! “
是 当用B类实验时,由于A,B类互相持有,导致在第二次暂停时(B类的指针已经释放)XX.TXT文件依然无法访问 并且在程序关闭后XX文件中也是为空白 没有“close ok!!”

大家有什么好一点的解决方法么? 当然我知道在类中加几个成员函数可以达成 但是这是牵强并且容易忘记的…… 能结合垃圾回收吗?……


------解决方案--------------------
c++.net被人遗忘的脚落。
代码不够整齐,累啊。。