【发布时间】:2013-06-28 15:06:18
【问题描述】:
我对 C++ 并不陌生,但我通常主要使用 C# 和其他托管语言工作,因此我不太精通共享指针等。
我基本上有一个 shared_ptrs 到自定义类对象的 3 维映射(用于 3d 目的)。
这些 shared_ptrs 存在于地图中,并在整个项目中被引用,到目前为止一切都很好。对于特定的功能,我将其中一些 shared_ptrs 存储在一个向量中,以便稍后在代码中进行迭代,但这似乎是事情发生故障的地方。
假设我有 100 个这样的对象,它们的指针存储在 3d 地图中,其中 3 个被添加到向量中,因为它们具有特殊的功能属性。当我遍历向量时,我在这 3 个对象上调用函数。这一切正常,直到 for 循环(用于迭代)在向量的元素 [1] 上第二次运行,此时元素 [0] 充满了损坏的数据(但元素 [1] 需要访问元素 [0 ] 来执行其中一项功能),这就是我得到错误的地方。
正如我所说,我对 shared_ptrs 不是很精通,但我认为数据不会被破坏,因为实际对象是在创建 3 维地图时创建的——而且,向量还没有已经超出范围了,因为我只是在 for 循环的第二次运行(有 3 个对象和 3 次迭代)。
我知道我一定是做错了什么,但我不知道如何进一步调试 - 基本上当我单步执行代码时,如果我查看元素 [0],它会进入 for 循环的第二次运行向量中的shared_ptr(使用VS)全部损坏。
这是代码的循环,您可以看到。向量是在此代码所在类的构造函数中创建的,而映射(创建 shared_ptrs 和对象的位置)在应用程序的主类中。此外,getAdjacent 将 objA 和 objB 作为指针,因此将相邻对象的数据“填充”到 objB 到 objA:
for(vector<shared_ptr<ObjectClass>>::iterator iterator = objects.begin(); iterator != objects.end(); iterator++)
{
shared_ptr<ObjectClass> objA = (shared_ptr<ObjectClass>) iterator->get();
shared_ptr<ObjectClass> objB;
m_3DMap->getAdjacent(objA, objB);
objA->move(objB);
}
这可能与我在iterator->get() 上的演员阵容有关吗?我看不到任何其他方法可以做到这一点,因为如果我没有那个演员,VS 说它 无法从 ObjectClass* 转换为 shared_ptr 这对我来说也很困惑,因为我认为我有一个 shared_ptrs 的向量?..
感谢您的宝贵时间,如果有人能提供帮助,那就太好了。
【问题讨论】:
-
您应该避免在模板上使用
>>。一些编译器会将其解释为shift right。顺便说一句:)
标签: c++ pointers vector scope shared-ptr