代码之家  ›  专栏  ›  技术社区  ›  Ilya Suzdalnitski

空指针比较失败

  •  2
  • Ilya Suzdalnitski  · 技术社区  · 14 年前

    我在一个类中初始化一个空指针。然后我检查在同一个类中是否为空。但并不总是0x0。有时是0x8或0xfeffffff或0x3f8000000或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没有初始化,正在被复制。但是它是空的,不应该被复制。

    谢谢。

    5 回复  |  直到 14 年前
        1
  •  11
  •   anon    14 年前

    这是:

    MeshObject::MeshObject(const MeshObject &_copyFromMe)
    

    是复制构造函数。因为它是一个构造函数,所以它也应该将vertexcolors成员设置为一些已知的有效值,希望是有效的值,但它不是,除非被复制的对象中的值不为空。但如果它是空的呢?基本上,if()需要一个else。

        2
  •  6
  •   AnT stands with Russia    14 年前

    代码是不完整的,但有一个猜测我可以。

    当你构造一个 MeshObject 使用上面的类 复制构造函数 源对象有 NULL 在其 mesh.vertexColors ,新对象的 网格顶点颜色 将包含垃圾,因为您根本不初始化它。

    例如

    MeshObject a;
    // `a.mesh.vertexColors` is NULL
    
    MeshObject b = a;
    // `b.mesh.vertexColors` is garbage
    

    你需要初始化 网格顶点颜色 在所有的复制构造函数中,不仅当源不为空时。

        3
  •  3
  •   Judge Maygarden    14 年前
    MeshObject o1;      // vertexColor is NULL
    MeshObject o2(o1);  // vertexColor is undefined
    MeshObject o3(o2);  // BOOM!
    
        4
  •  2
  •   Puppy    14 年前

    基本上,当调用复制构造函数时,它不会调用普通构造函数。复制构造函数必须将指针初始化为与普通构造函数相同的null。否则,它有一个随机值,因为您正在使用未初始化的内存。一个好的编译器应该给你一个警告或者错误。

        5
  •  1
  •   andand    14 年前

    根据其他人的说法,作为一般规则,我将初始化在非复制构造函数中初始化的复制构造函数中的所有成员,除非有令人信服的理由不这样做。我不记得上次有这样的原因。