【问题标题】:Pointer member mysteriously getting erased?指针成员神秘地被抹去?
【发布时间】:2015-04-24 07:47:30
【问题描述】:

所以我有一个带有指针的 ClassA,以及一个为该指针赋值的函数:

class ClassA
{
private:
    SomeType* _someType;

public:
    void AssignSomeTypePtr(SomeType* someType) 
    {
        _someType = someType;
    }
};

然后我有 ClassB,它创建 SomeType 指针,并将它分配给我的 ClassA 类,这些类保存在一个向量中:

class ClassB
{
private:
    std::vector<ClassA> _classes;

public:
    void MakeSomePointers(unsigned char* rawData)
    {
        SomeType* someType = reinterpret_cast<SomeType*>(rawData);
        for (auto A : _classes)
        {
            A.AssignSomeTypePtr(someType);
        }
    }
};

当我想从我的 ClassA 类中调用一个函数时,问题就出现了,该函数利用了之前由 ClassB 分配的 SomeType 指针。出于某种原因,_someType 不再保存 ClassB 分配的地址(它恢复为在 ClassA 构造函数中的初始化值,即 null)。

几个小时以来,我一直在摸不着头脑,试图找出问题所在。我基本上不间断地编码了 4-5 个小时,所以我可能已经遇到了我犯了一个基本错误的那个时间段,但由于某种原因它超出了我的头脑。我已经确认通过 AssignSomePtr 函数分配的指针确实包含有效地址,并且 _someType 确实被分配了该值。但是当我调用 ClassA 类中使用该指针的函数时,突然 _someType == null。顺便说一句,我在调用此函数之前分配了值。

对可能出现的问题有任何想法吗?

附:我知道指针等于坏消息。不幸的是,我正在为具有非常独特的数据存储方式的 3D 游戏编写文件序列化库,因此诸如 boost 之类的序列化库对我的帮助为零。

【问题讨论】:

  • reinterpret_cast&lt;SomeType*&gt; 注意指针对齐。

标签: c++ pointers


【解决方案1】:

如果for 循环与您的原始帖子中的一样,则A 是当前向量元素的本地副本。在for 循环的每次迭代中,您都将指针值分配给矢量元素的副本,然后立即销毁该副本。矢量本身保持不变。

如果你想修改实际的向量元素,你必须将你的循环变量声明为 reference

for (auto &A : _classes)

【讨论】:

  • @AlexeiLevenkov ClassA,如问题中所述,将具有默认的复制构造函数和赋值运算符。
  • 我知道这是我的一个简单的忽略。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
  • 2020-02-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多