NULL指针比较失败

Ily*_*ski 2 c++ null pointers

我正在一个类中初始化一个指向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()需要一个别的.

  • @Ilya为了给出一个完整的解释,我们必须看看你是如何使用这个类的,但是我猜这些副本正在你不希望它们出现的地方.此外,如果您有一个复制构造函数,您几乎肯定需要一个赋值运算符和一个析构函数. (3认同)
  • @Ilya:它不会那样影响它.发生的情况是您多次复制对象(隐式或显式).首先,通过复制在指针中创建一个带有垃圾值的对象,然后再尝试复制该"垃圾"对象. (2认同)

AnT*_*AnT 6

代码不完整,但有一个猜测我可以做.

当您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时.