// 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;
在 C + + 中,堆上有具有自动存储功能的对象、在堆栈上创建的对象和具有动态存储功能的对象,这些对象是用 new分配的,需要用 delete释放。(这些都是粗略的说法)
我们认为,对于用 new分配的每个对象,都应该有一个 delete。
剪辑
仔细想想,object2不一定是内存泄漏。
下面的代码只是为了表明一个观点,这是一个坏主意,永远不要喜欢这样的代码:
class B
{
public:
B() {}; //default constructor
B(const B& other) //copy constructor, this will be called
//on the line B object2 = *(new B())
{
delete &other;
}
}
在这种情况下,由于 other是通过引用传递的,因此它将是 new B()所指向的确切对象。因此,通过 &other获取其地址并删除指针将释放内存。
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
Object2是一个 B 类型的变量,存储在比如地址1(是的,我在这里选择任意数字)。在右边,您要求一个新的 B,或者一个指向 B 类型对象的指针。程序很高兴地把这个给你,并把你的新 B 分配给地址2,还在地址3中创建了一个指针。现在,访问地址2中的数据的唯一方法是通过地址3中的指针。接下来,使用 *取消对指针的引用,以获取指针所指向的数据(地址2中的数据)。这将有效地创建该数据的一个副本,并将其分配给 object2,分配到地址1中。记住,这是复制品,不是原件。