使用终结器释放内存

时间:2014-05-29 05:07:27

标签: c++ .net memory-management c++-cli finalizer

我是C++/CLI的新手,想要释放内存的说明。

想象一个场景,其中:

sampleServer srv = new sampleServer()
while(true)
{
    ABC newObject = srv.getItem();
}

ABC^ sampleServer::getItem(){ return gcnew ABC(//LIST OF some parameters);}

现在,除非Dispose调用newObject,否则由于连续的新对象流被返回而没有被释放,内存将继续被分配,但不会被释放

如果我不想拨打DIspose,唯一的另一种方法就是让finalizers免费提供内存。

但是,考虑到类sampleServer,它没有ABS类的对象作为其成员之一。它仍然能够返回它的新实例,因为to classes在同一名称空间中。

因此,如果我正在考虑上课sampleServer,我应该将Finalizer称为什么?

如果思考过程不正确,在上面给出的情况下如何释放内存?

1 个答案:

答案 0 :(得分:0)

由于gcnewABC一起使用,因此必须为ref class

然后,你的编译器应该给你:

  

'*':不能在“ABC”类型上使用此间接

现在,假设您通过使用CLI *句柄语法替换C ++ ^类型修饰符的语法来解决此问题,您实际上有:

while(true)
{
    ABC^ newObject = srv->getItem();
}

您正在考虑的方案不存在。newObject超出范围时,通过扫描垃圾收集根对象中的连接对象无法访问它所引用的对象( S)。因此,当垃圾收集器运行[1]时,可以释放所有对象。

使用垃圾收集对象系统,内存资源由系统处理。您只需关心对象持有的系统外部资源。这将包括通过mallocnew获得的“本机堆”内存,处理通过操作系统获得的各种对象(文件描述符,套接字,窗口等)。

在您的课程中,您没有显示任何所谓的“本机资源”或本机资源的任何递归所有权。

[1]理论上,除了性能原因之外,垃圾收集器不需要运行,直到不再提交虚拟内存(例如,系统磁盘空间不足)。因此,除非您正在评估垃圾收集器,否则不要查看内存使用情况。