为什么使用“new”会导致内存泄漏?

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我首先学习了C#,现在我从C++开始。据我所知,接线员new在C++中与C#中的不相似。

您能解释一下这个示例代码中内存泄漏的原因吗?

class A { ... };
struct B { ... };

A *object1 = new A();
B object2 = *(new B());
少女女先疯队长少女女先疯队长提问于
看破红尘的黑猫回答于
已采纳

当你写T t;您正在创建一个类型为T带着自动存储持续时间...。当它超出范围时,它会被自动清理。

当你写new T()您正在创建一个类型为T带着动态存储持续时间。不会自动清理的。

你需要传递一个指向它的指针delete为了清理它:

​您就失去了指向new所以,即使你想删除它,你也不能删除它。

您应该更喜欢自动存储持续时间。需要一个新的对象,只需写:

A a; // a new object of type A
B b; // a new object of type B

如果确实需要动态存储持续时间,请将指向分配对象的指针存储在自动删除该对象的自动存储持续时间对象中。

template <typename T>
class automatic_pointer {
public:
    automatic_pointer(T* pointer) : pointer(pointer) {}

    // destructor: gets called upon cleanup
    // in this case, we want to use delete
    ~automatic_pointer() { delete pointer; }

    // emulate pointers!
    // with this we can write *p
    T& operator*() const { return *pointer; }
    // and with this we can write p->f()
    T* operator->() const { return pointer; }

private:
    T* pointer;

    // for this example, I'll just forbid copies
    // a smarter class could deal with this some other way
    automatic_pointer(automatic_pointer const&);
    automatic_pointer& operator=(automatic_pointer const&);
};

automatic_pointer<A> a(new A()); // acts like a pointer, but deletes automatically
automatic_pointer<B> b(new B()); // acts like a pointer, but deletes automatically

我不是酱油哥Junior Author回答于

一步一步的解释:

// creates a new object on the heap:
new B()
// dereferences the object
*(new B())
// calls the copy constructor of B on the object
B object2 = *(new B());

因此,在结束时,堆上有一个对象,没有指向它的指针,所以不可能删除。

另一个样本是:

A *object1 = new A();

只有当你忘记了的时候,才是内存泄漏。delete分配的内存:

delete object1;

扫码关注云+社区