在方法内创建的对象

时间:2016-12-02 11:58:19

标签: java c++ memory-management heap

我想知道在本地方法中实例化的对象存储在哪里?据我所知,对象存储在堆中,它们的引用存储在堆栈中。如果是这样,那么当函数返回时,对象的引用不再存在(因为弹出了函数的本地堆栈帧),对象是否保留在堆中,或者我们是否必须手动删除它(或者使用垃圾收集,如Java)?

1 个答案:

答案 0 :(得分:2)

这取决于您打算如何处理该对象,如果您返回该对象,则它的生命周期会延长。如果你把它创建为临时的,那么有两种可能的结果。

  1. 如果使用new创建对象。如果创建指向新对象的指针,则当方法超出范围时,将删除指针。但是对象仍然导致内存泄漏,需要明确删除该对象。

  2. 如果您不使用new。当范围结束时,该对象将被删除。

  3. 这两个结果都假设您没有返回对象,并将其实例化为函数中的临时对象。

    以下是一些示例代码:

    class ObjectClass {
    public:
            ObjectClass() {}
    
    };
    
    void myFunction() {
            ObjectClass my_obj(); //memory is handled for you
            ObjectClass * my_dynamic_obj = new ObjectClass();
            delete my_dynamic_obj; //if delete is not called then
            // the pointer my_dynamic_obj will be deleted but the object itself will remain
            return;
    }
    
    main() {
            myFunction();
            return 0;
    }