2011-12-11 40 views
0

可以说我有一个对象,它的用途是容纳一堆为对象类型MyObject的指针,并且可以说我想要的功能,增加了新的MyObjects到集合,像这样:如何分配堆指针

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

可以说,MyCollection.add接受一个特定的集合对象和一个指针,并以某种方式在内部存储它。然而,这个函数的问题在于newObject自身是持久化的时候,* newObject指针会在函数调用后被销毁,所以add()函数不再有一个指向该对象的指针。有没有什么好方法可以让某个持久指针?

谢谢

+0

我会说,“是的,这可以完成”;很可能是“使用标准库可以做得更好”,并且在任何情况下,您都没有给出足够的细节,代码和上下文以允许有意义的响应。 –

+0

newObject变量将被销毁,但创建的对象不会像您已将指针存储在集合中一样 – Ankit

回答

5

然而与此功能的问题,而NEWOBJECT本身 是持久的,所以* NEWOBJECT指针获取 函数调用后销毁,因此add()函数不再有指针 真正指向的对象。

这背离了对物体和指针如何工作的巨大误解。

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

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

1

基于堆栈的数据 - 比如你的指针 - 本身并没有被“销毁”。变量本身超出范围,但它包含的数据 - 即MyObject对象的地址 - 仍然完全有效。如果add()方法复制指针的值,则全部都是好的。

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

myVector.push_back(newObject); 

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

0

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

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

MyCollection.add(mycollection, newObject); 

这也许应该是:

mycollection.add(newObject); 
0

这是没有问题的。一个定义良好的add函数会复制指针,所以原来的指针超出范围不会引起任何问题。