假设我有一个对象,其目的是为对象类型MyObject保存一堆指针,并且假设我想要一个将新的MyObjects添加到集合中的函数,如下所示:
void MyCollection::addObject(){
MyObject *newObject = new MyObject();
MyCollection.add(mycollection, newObject);
}
让我们说MyCollection.add接受一个特定的集合对象和一个指针,并以某种方式在内部存储它。但是这个函数的问题是当newObject本身是持久的时,* newObject指针在函数调用之后被销毁,所以add()函数不再有一个真正指向该对象的指针。是否有任何好方法可以以某种方式制作持久性指针?
由于
答案 0 :(得分:5)
但是这个函数的问题在于newObject本身 是持久的,* newObject指针在之后被销毁 函数调用所以add()函数不再有指针 真的指向对象。
这背叛了对象和指针如何工作的巨大误解。
指针是一个地址。 new
在堆上创建一个对象并返回该地址。当您将该地址传递给集合时,集合将获取该地址的副本,该地址与您从new
获得的地址完全相同。当变量newObject
超出范围并被销毁时,集合仍然具有地址的副本,并且地址仍指向该对象。无论您制作和销毁多少份地址,地址仍然很好,地址指向的对象仍然很好。
实际上,您从new
返回的地址是new
在内部生成的地址的副本,并且原始内部值已被销毁。当你说MyObject *newObject = new MyObject();
时,你正在制作另一份副本。但这并不重要,因为地址的每个副本都与其他副本一样好。
答案 1 :(得分:1)
基于堆栈的数据 - 就像你的指针一样 - 本身并没有被“破坏”。变量本身超出了范围,但它包含的数据 - 即MyObject
对象的地址 - 仍然完全有效。如果add()
方法复制指针的值,那么一切都会很好。
顺便说一下,我希望add()
的实施只是
myVector.push_back(newObject);
其中myVector
是std::vector
的实例。无需重新发明轮子!
答案 2 :(得分:0)
编写的代码很好。指针将(必须)由add()方法复制,其签名大概为void add(MyObject*)
。
顺便说一句,这里的C ++无效:
MyCollection.add(mycollection, newObject);
应该是:
mycollection.add(newObject);
答案 3 :(得分:0)
这不是问题。定义良好的add函数将生成指针的副本,因此原始指针超出范围不会导致任何问题。