我正在一个类中初始化一个指向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) );
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序崩溃,因为vertexColors未初始化并正在被复制.但它是NULL,不应复制.
谢谢.
小智 11
这个:
MeshObject::MeshObject(const MeshObject &_copyFromMe)
Run Code Online (Sandbox Code Playgroud)
是一个复制构造函数.因为它是一个构造函数,所以它也应该将vertexColors成员设置为某个已知且希望有效的值,但它不是,除非被复制的东西中的值不是NULL.但是如果它是NULL呢?基本上,你的if()需要一个别的.
代码不完整,但有一个猜测我可以做.
当您MeshObject使用上面的复制构造函数构造类的对象并且源对象NULL在其中时mesh.vertexColors,新对象mesh.vertexColors将包含垃圾,因为您根本不初始化它.
例如
MeshObject a;
// `a.mesh.vertexColors` is NULL
MeshObject b = a;
// `b.mesh.vertexColors` is garbage
Run Code Online (Sandbox Code Playgroud)
mesh.vertexColors在所有情况下,您都需要在复制构造函数中进行初始化,而不仅仅是在源不为null时.