指针成员神秘地被删除?
Pointer member mysteriously getting erased?
所以我有一个带指针的 ClassA,以及一个为该指针赋值的函数:
class ClassA
{
private:
SomeType* _someType;
public:
void AssignSomeTypePtr(SomeType* someType)
{
_someType = someType;
}
};
然后我有 ClassB 创建 SomeType 指针,并将其分配给我的 ClassA classes,它们保存在一个向量中:
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 class 调用一个函数时,问题出现了,该函数使用了先前由 ClassB 分配的 SomeType 指针。出于某种原因,_someType 不再保存由 ClassB 分配给它的地址(它恢复到它在 ClassA 构造函数中的初始化值,即 null)。
几个小时以来,我一直在摸不着头脑,试图找出问题所在。我基本上一直在不停地编码 4-5 个小时,所以我可能遇到了犯基本错误的那个时间段,但由于某种原因,它让我无法理解。我已经确认通过 AssignSomePtr 函数分配的指针确实包含一个有效地址,并且 _someType 确实被分配了该值。但是当我调用 ClassA class 中使用该指针的函数时,突然间 _someType == null。顺便说一句,我在调用此函数之前分配了值。
对可能出现的问题有什么想法吗?
P.S。我知道指针等于坏消息。不幸的是,我正在为具有非常独特的数据存储方式的 3D 游戏编写文件序列化库,因此像 boost 这样的序列化库对我的帮助为零。
如果for
循环写成你原来的post,那么A
是当前向量元素的本地副本 .在该 for
循环的每次迭代中,您将指针值分配给矢量元素的 copy,然后立即销毁该副本。矢量本身保持不变。
如果你想修改实际的矢量元素
,你必须将循环变量声明为引用
for (auto &A : _classes)
所以我有一个带指针的 ClassA,以及一个为该指针赋值的函数:
class ClassA
{
private:
SomeType* _someType;
public:
void AssignSomeTypePtr(SomeType* someType)
{
_someType = someType;
}
};
然后我有 ClassB 创建 SomeType 指针,并将其分配给我的 ClassA classes,它们保存在一个向量中:
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 class 调用一个函数时,问题出现了,该函数使用了先前由 ClassB 分配的 SomeType 指针。出于某种原因,_someType 不再保存由 ClassB 分配给它的地址(它恢复到它在 ClassA 构造函数中的初始化值,即 null)。
几个小时以来,我一直在摸不着头脑,试图找出问题所在。我基本上一直在不停地编码 4-5 个小时,所以我可能遇到了犯基本错误的那个时间段,但由于某种原因,它让我无法理解。我已经确认通过 AssignSomePtr 函数分配的指针确实包含一个有效地址,并且 _someType 确实被分配了该值。但是当我调用 ClassA class 中使用该指针的函数时,突然间 _someType == null。顺便说一句,我在调用此函数之前分配了值。
对可能出现的问题有什么想法吗?
P.S。我知道指针等于坏消息。不幸的是,我正在为具有非常独特的数据存储方式的 3D 游戏编写文件序列化库,因此像 boost 这样的序列化库对我的帮助为零。
如果for
循环写成你原来的post,那么A
是当前向量元素的本地副本 .在该 for
循环的每次迭代中,您将指针值分配给矢量元素的 copy,然后立即销毁该副本。矢量本身保持不变。
如果你想修改实际的矢量元素
,你必须将循环变量声明为引用for (auto &A : _classes)