我正在一个类中初始化一个指向NULL的指针。然后我检查在同一个类中它是否为NULL。但它并不总是0x0。有时它是0x8或0xfeffffff或0x3f800000或0x80或其他奇怪的东西。在大多数情况下,指针是0x0但有时会以某种方式改变。
我确信我的代码中的任何地方都没有更改它。有没有一种方法可以被“本身”改变?
这是我的代码:
MeshObject::MeshObject()
{
mesh.vertexColors = NULL;
}
MeshObject::MeshObject(const MeshObject &_copyFromMe)
{
SimpleLog("vertexColors pointer: %p", _copyFromMe.mesh.vertexColors);
if (_copyFromMe.mesh.vertexColors != NULL)
{
SimpleLog("vertexColors");
this->mesh.vertexColors = new tColor4i[_copyFromMe.mesh.vertexCount];
memcpy(this->mesh.vertexColors, _copyFromMe.mesh.vertexColors, _copyFromMe.mesh.vertexCount * sizeof(tColor4i) );
}
}
我的应用程序崩溃,因为vertexColors未初始化并正在被复制。但它是NULL,不应复制。
感谢。
答案 0 :(得分:11)
此:
MeshObject::MeshObject(const MeshObject &_copyFromMe)
是一个复制构造函数。因为它是一个构造函数,所以它也应该将vertexColors成员设置为某个已知的&希望有效的值,但它不是,除非被复制的东西中的值不是NULL。但是如果它是NULL呢?基本上,你的if()需要一个别的。
答案 1 :(得分:6)
代码不完整,但有一个猜测我可以做。
使用上面的复制构造函数构造MeshObject
类的对象时,源对象的NULL
中有mesh.vertexColors
,新对象的{{ 1}}将包含垃圾,因为你根本没有初始化它。
例如
mesh.vertexColors
在所有情况下,您需要在复制构造函数中初始化MeshObject a;
// `a.mesh.vertexColors` is NULL
MeshObject b = a;
// `b.mesh.vertexColors` is garbage
,而不仅仅是在源不为空时。
答案 2 :(得分:3)
MeshObject o1; // vertexColor is NULL
MeshObject o2(o1); // vertexColor is undefined
MeshObject o3(o2); // BOOM!
答案 3 :(得分:2)
基本上,当调用复制构造函数时,它不会调用普通的构造函数。复制构造函数必须将指针初始化为NULL,与普通构造函数相同。否则,它具有随机值,因为您使用的是未初始化的内存。一个体面的编译器应该给你一个警告或错误。
答案 4 :(得分:1)
为了捎带其他人所说的,作为一般规则,我将初始化我在非复制构造函数中初始化的复制构造函数中的所有成员,除非有一些令人信服的理由不这样做。我不记得最后一次出现这样的原因。