非托管资源已释放

秦剑 2012-06-14 05:12:34
class TestNet
{
TcpClient _client = null;
NetworkStream ns = null;
public TestNet()
{
_client = new TcpClient("127.0.0.1", int.Parse("7000"));
ns = _client.GetStream();
}

~TestNet()
{
string sendStr = "123456789";
byte[] data = System.Text.Encoding.UTF8.GetBytes (sendStr);
ns.Write(data ,0, data.Length);// 非托管资源已释放

}
}
...全文
154 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
qldsrx 2012-07-15
  • 打赏
  • 举报
回复
Dispose会在对象销毁前被调用的,即使你不用using,总有被销毁的时候,那个时候就会自动被调用。
秦剑 2012-07-15
  • 打赏
  • 举报
回复
谢谢!! 我有这个想法主要是因为以前已经这么写了,所以想兼容以前的.

请问:如果TestNet实了现IDisposable接口,也只有用using才会调用Dispose方法吗?
[Quote=引用 8 楼 的回复:]

在.net中,许多对象的析构函数其实根本不执行,因为在dispose方法中就已经通知GC阻止调用析构函数了。

想要保证逻辑上去处理所谓清理代码,应该让你的类型使用IDisposable接口,并且在调用对象时使用using{}结构确保可以调用dispose方法。

你的dispose方法会尽早执行,此时析构函数还不知道何年何月才执行呢。
[/Quote]
bigbaldy 2012-06-15
  • 打赏
  • 举报
回复
因为在析构TestNet之前,ns就已经被析构了。成员变量先被构造,同样也先被析构,这就是为啥析构函数中的Dispose方法的参数值是False,防止重复析构
__天涯寻梦 2012-06-14
  • 打赏
  • 举报
回复
这样写吧
~TestNet()
{
try
{
using (TcpClient tc = new TcpClient("127.0.0.1", int.Parse("7000")))
{
string sendStr = "123456789";
byte[] data = System.Text.Encoding.UTF8.GetBytes(sendStr);
tc.GetStream().Write(data, 0, data.Length);// 非托管资源已释放
}
}
catch (Exception)
{
}
}
  • 打赏
  • 举报
回复
在.net中,许多对象的析构函数其实根本不执行,因为在dispose方法中就已经通知GC阻止调用析构函数了。

想要保证逻辑上去处理所谓清理代码,应该让你的类型使用IDisposable接口,并且在调用对象时使用using{}结构确保可以调用dispose方法。

你的dispose方法会尽早执行,此时析构函数还不知道何年何月才执行呢。
  • 打赏
  • 举报
回复
这是c#,不是c++。

不要乱套用析构函数的概念。这根本不是c++。
WAN 2012-06-14
  • 打赏
  • 举报
回复
TcpClient也要重新建一个
WAN 2012-06-14
  • 打赏
  • 举报
回复
那就在~TestNet()里重新建一个NetworkStream,不要用原来的ns
秦剑 2012-06-14
  • 打赏
  • 举报
回复
还是报错

[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:
我的程序只能这么办,有没有什么方法可以实现在对象销毁前做处理?

引用 1 楼 的回复:

最好不要在析构函数里做这种事情,可能 _client 和 ns 先被析构掉了,如果你要释放,就指定一个方法,手动调用吧


试试把
TcpClient _client = null;
NetworkStream ns = null;
声明为静态的
[/Quote]
cnfixit 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
我的程序只能这么办,有没有什么方法可以实现在对象销毁前做处理?

引用 1 楼 的回复:

最好不要在析构函数里做这种事情,可能 _client 和 ns 先被析构掉了,如果你要释放,就指定一个方法,手动调用吧
[/Quote]

试试把
TcpClient _client = null;
NetworkStream ns = null;
声明为静态的
秦剑 2012-06-14
  • 打赏
  • 举报
回复
我的程序只能这么办,有没有什么方法可以实现在对象销毁前做处理?
[Quote=引用 1 楼 的回复:]

最好不要在析构函数里做这种事情,可能 _client 和 ns 先被析构掉了,如果你要释放,就指定一个方法,手动调用吧
[/Quote]
__天涯寻梦 2012-06-14
  • 打赏
  • 举报
回复
最好不要在析构函数里做这种事情,可能 _client 和 ns 先被析构掉了,如果你要释放,就指定一个方法,手动调用吧

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧