我是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
称为什么?
如果思考过程不正确,在上面给出的情况下如何释放内存?
答案 0 :(得分:0)
由于gcnew
与ABC
一起使用,因此必须为ref class
。
然后,你的编译器应该给你:
'*':不能在“ABC”类型上使用此间接
现在,假设您通过使用CLI *
句柄语法替换C ++ ^
类型修饰符的语法来解决此问题,您实际上有:
while(true)
{
ABC^ newObject = srv->getItem();
}
您正在考虑的方案不存在。当newObject
超出范围时,通过扫描垃圾收集根对象中的连接对象无法访问它所引用的对象( S)。因此,当垃圾收集器运行[1]时,可以释放所有对象。
使用垃圾收集对象系统,内存资源由系统处理。您只需关心对象持有的系统外部资源。这将包括通过malloc
或new
获得的“本机堆”内存,处理通过操作系统获得的各种对象(文件描述符,套接字,窗口等)。
在您的课程中,您没有显示任何所谓的“本机资源”或本机资源的任何递归所有权。
[1]理论上,除了性能原因之外,垃圾收集器不需要运行,直到不再提交虚拟内存(例如,系统磁盘空间不足)。因此,除非您正在评估垃圾收集器,否则不要查看内存使用情况。