【问题标题】:Use of Finalizers to free up memory使用终结器释放内存
【发布时间】:2014-05-29 05:07:26
【问题描述】:

我是 C++/CLI 的新手,想了解一下有关释放内存的问题。

想象一个场景,其中:

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

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

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

如果我不想调用DIspose,唯一的其他方法是让finalizers负责释放内存。

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

所以如果我正在考虑上课sampleServer,我应该怎么称呼Finalizer

如果思维过程不正确,在上述情况下我将如何释放内存?

【问题讨论】:

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


    【解决方案1】:

    由于您将gcnewABC 一起使用,因此它必须是ref class

    那么,你的编译器应该给你:

    '*' : 不能在类型 'ABC' 上使用此间接方法

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

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

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

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

    在您的课程中,您没有展示任何所谓的“原生资源”或原生资源的任何递归所有权。

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

    【讨论】:

    • 抱歉,我在代码中犯了一些错误。我已经纠正了。请看一看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2020-07-20
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    相关资源
    最近更新 更多