【发布时间】:2010-12-20 09:30:26
【问题描述】:
我想要做的基本上是创建两个对象向量,其中一些对象被输入到两个列表中,而一些对象只被输入到一个列表中。我发现的第一个问题是,当我使用 push_back() 将一个对象添加到两个列表中时,该对象被复制了,因此当我从一个列表中更改它时,另一个列表中的对象没有改变。为了解决这个问题,我尝试创建一个指向对象的指针列表作为列表之一。但是,当我稍后访问指针时,数据似乎已损坏,数据成员值都是错误的。以下是我的代码的一些 sn-ps:
向量的定义:
vector<AbsorbMesh> meshList;
vector<AbsorbMesh*> absorbList;
... 向两者添加对象:
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);
访问对象:
if (absorbList.size() > 0)
{
float receivedPower = absorbList[0]->receivedPower;
}
我做错了什么?
【问题讨论】:
-
为什么meshlist 会存储实际对象的副本?如果你想在两个向量中存储相同的对象,那么两者都应该是指针
-
您的实际目标是什么(除了 2 个半相似列表)?在 STL 容器中存储指针通常会导致坏事。
-
@Adam 为什么会这样?仅仅是因为指针可能不会被释放?在我看来,将指针(或智能指针)存储在 STL 容器中是件好事,因为这样一来,例如,当容器调整大小时,您就无需为对象的复制构造付费。
-
@Edison:我完全同意智能指针。标准指针往往会导致问题,因为您必须在所有操作中自己处理释放并防止空指针。对于所有可用的库,将标准指针存储在 STL 容器中似乎很愚蠢。如果您担心调整大小的成本,那么您将容量设置得太低了。
-
在容器中存储指针并没有错。如果你有一个体面的设计,那么应该清楚地了解哪个对象“拥有”内存并负责清理它。对内存分配/释放进行精确控制是使用 C++ 的主要原因之一。如果您不想这样做并在任何地方使用智能指针,请使用 Java 或 C# 之类的东西。
标签: c++ class reference vector pointers