在函数中留下指针会导致内存泄漏吗?

时间:2016-03-16 07:41:59

标签: c++ pointers memory-leaks

假设我有一个函数或类来维护一些指向其他数据对象的指针,如下所示:

class MyObject {
    ...
    AnotherObject* o1, *o2;
    SomeObject* s1, *s2;
    ...
}

int main() {
    ...
    MyObject mo1 = new MyObject();
    ... // do stuff with mo1
    delete mo1;
}

假设在初始化期间/之后从其他地方为它们分配了有效的指针值。

当我在内部指定这些指针后销毁MyObject对象时,如果我在销毁过程中没有将指针置空,会导致内存泄漏吗?:

MyObject::~MyObject() {
    o1 = nullptr;
    o2 = nullptr;
    ...
}

感谢。

3 个答案:

答案 0 :(得分:2)

不,它不会导致内存泄漏。但请注意:

MyObject mo1 = new MyObject();
// do stuff with mo1
delete mo1;
如果do stuff with mo1抛出异常(如果它包含对nullptr的引用,则可能是这种情况),

将导致内存泄漏。因此,建议不要像你那样使用裸指针而是使用智能指针 - 这样RAII可以保证你的指针被删除。

答案 1 :(得分:0)

听起来你来自Java背景,其中设置指向null的指针是必要的,以允许垃圾收集器回收其他对象。如果是这样,答案很简单:不,那不是它在C ++中的工作方式。将指针设置为null对内存使用没有任何影响,并且无论如何都没有可以回收任何内存的垃圾收集器。

相反,你应该考虑所有权。大多数对象有一个特定的所有者删除该所有者后,其拥有的对象也将被删除。这最方便地使用unique_ptr而不是原始指针建模。对于拥有更复杂所有权的对象,有shared_ptr和weak_ptr。

再一次,没有垃圾收集器,所以每当你使用new来创建一个对象时,不知何故,某个地方必须有一个对应的delete。确保删除这些删除的最简单方法是使用unique_ptr。

也要经常使用new。您的mo1对象可以在堆栈上分配而没有任何问题:它的生命周期仅限于一个函数(main),所以为什么不使用它只是将它分配为MyObject mo1; - 那个'足够,不需要新的或删除任何东西。

答案 2 :(得分:0)

不,不会。由于使用new分配的未删除内存而发生内存泄漏。取消指针只是一种方法,以便稍后检查它是否被删除,它与内存泄漏无关。

另一方面,手动处理内存并不是实现目标的最佳方式。智能指针存在(std::shared_ptrstd::unique_ptr ...)。你应该看看它们。