如何分配堆指针

时间:2011-12-11 23:50:21

标签: c++ memory-management

假设我有一个对象,其目的是为对象类型MyObject保存一堆指针,并且假设我想要一个将新的MyObjects添加到集合中的函数,如下所示:

void MyCollection::addObject(){
    MyObject *newObject = new MyObject();
    MyCollection.add(mycollection, newObject);
}

让我们说MyCollection.add接受一个特定的集合对象和一个指针,并以某种方式在内部存储它。但是这个函数的问题是当newObject本身是持久的时,* newObject指针在函数调用之后被销毁,所以add()函数不再有一个真正指向该对象的指针。是否有任何好方法可以以某种方式制作持久性指针?

由于

4 个答案:

答案 0 :(得分:5)

  

但是这个函数的问题在于newObject本身   是持久的,* newObject指针在之后被销毁   函数调用所以add()函数不再有指针   真的指向对象。

这背叛了对象和指针如何工作的巨大误解。

指针是一个地址。 new在堆上创建一个对象并返回该地址。当您将该地址传递给集合时,集合将获取该地址的副本,该地址与您从new获得的地址完全相同。当变量newObject超出范围并被销毁时,集合仍然具有地址的副本,并且地址仍指向该对象。无论您制作和销毁多少份地址,地址仍然很好,地址指向的对象仍然很好。

实际上,您从new返回的地址是new在内部生成的地址的副本,并且原始内部值已被销毁。当你说MyObject *newObject = new MyObject();时,你正在制作另一份副本。但这并不重要,因为地址的每个副本都与其他副本一样好。

答案 1 :(得分:1)

基于堆栈的数据 - 就像你的指针一样 - 本身并没有被“破坏”。变量本身超出了范围,但它包含的数据 - 即MyObject对象的地址 - 仍然完全有效。如果add()方法复制指针的值,那么一切都会很好。

顺便说一下,我希望add()的实施只是

myVector.push_back(newObject);

其中myVectorstd::vector的实例。无需重新发明轮子!

答案 2 :(得分:0)

编写的代码很好。指针将(必须)由add()方法复制,其签名大概为void add(MyObject*)

顺便说一句,这里的C ++无效:

MyCollection.add(mycollection, newObject);

应该是:

mycollection.add(newObject);

答案 3 :(得分:0)

这不是问题。定义良好的add函数将生成指针的副本,因此原始指针超出范围不会导致任何问题。