Nig*_*gel 1 c++ pointers reference class vector
我想要做的是基本上创建两个对象向量,其中一些对象被输入到两个列表中,一些对象被输入到一个对象中.我发现的第一个问题是,当我使用push_back()将对象添加到两个列表中时,对象被复制,这样当我从一个列表中更改它时,对象在另一个列表中没有改变.为了解决这个问题,我尝试创建一个指向对象的指针列表作为列表之一.但是,当我稍后访问指针时,数据似乎已损坏,数据成员值都是错误的.以下是我的代码的一些片段:
载体的定义:
vector<AbsorbMesh> meshList;
vector<AbsorbMesh*> absorbList;
Run Code Online (Sandbox Code Playgroud)
...向两者添加一个对象:
AbsorbMesh nurbsMesh = nurbs.CreateMesh(uStride, vStride);
// Add to the absorption list
absorbList.push_back(&nurbsMesh);
// Store the mesh in the scene list
meshList.push_back(nurbsMesh);
Run Code Online (Sandbox Code Playgroud)
访问对象:
if (absorbList.size() > 0)
{
float receivedPower = absorbList[0]->receivedPower;
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
有一些细节缺失,但猜测.
nurbsMesh超出了push_back和之间的范围absorbList[0]->receivedPower.
所以现在你的指针向量包含一个指向不再存在的对象的指针.
尝试将复制构造函数添加到AbsorbMesh类并添加到您的矢量中.
absorbList.push_back(new AbsorbMesh(nurbsMesh));
meshList.push_back(nurbsMesh);
Run Code Online (Sandbox Code Playgroud)
不要忘了删除对象absorbList,像这样的
for(vector<AbsorbMesh*>::iterator it = absorbList.begin(); it != absorbList.end(); it++) {
delete it;
}
Run Code Online (Sandbox Code Playgroud)
或者在向量中存储共享指针而不是裸指针.如果你感兴趣的话,Boost有一个很好的共享指针实现.请参阅此处的文档
如果要在另一个向量中修改对象中的项目更新,则需要在两个向量中存储指针.
使用您的原始要求(更新一个向量中的项目会影响另一个向量中的项目,这是我如何使用boost共享指针执行此操作.(警告,未经测试的代码)
vector<boost::shared_ptr<AbsorbMesh> > meshList;
vector<boost::shared_ptr<AbsorbMesh> > absorbList;
boost::shared_ptr<AbsorbMesh> nurb = new AbsorbMesh(nurbs.CreateMesh(uStride, vStride));
meshList.push_back(nurb);
absorbList.push_back(nurb);
...
...
if (absorbList.size() > 0)
{
float receivedPower = absorbList[0].get()->receivedPower;
}
Run Code Online (Sandbox Code Playgroud)
您正在存储堆栈上分配的对象的地址.nurbsMesh一旦你的方法push_back()结束,对象就会被破坏.如果您之后尝试访问此指针,则该对象已被销毁并包含垃圾.您需要的是保留即使在功能超出范围后仍然存在的对象.为此,请使用从堆中为对象分配内存new.但对于每一个新的你应该有一个相应的delete.但是在你的情况下,当你将相同的指针推入两个向量时,你会有删除它的问题.要解决这个问题,您需要一些类型引用计数机制.
| 归档时间: |
|
| 查看次数: |
32294 次 |
| 最近记录: |