2010-04-01 150 views
2

我在一个类中初始化一个空指针。之后,我检查它是否在同一个类中是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,不应该被复制。

谢谢。

+1

您不要在复制构造函数中设置vertexColors。 – 2010-04-01 16:20:27

回答

11

此:

MeshObject::MeshObject(const MeshObject &_copyFromMe) 

是拷贝构造函数。因为它是一个构造函数,所以它也应该将vertexColors成员设置为一些已知的有效值,但它不是,除非被复制的值不是NULL。但是如果它是NULL呢?基本上,你的if()需要别的。

+0

It worked :) 这有点奇怪 - 初始化复制类中的指针会如何影响正在复制的类中的值? 我的意思是如何设置this-> mesh.vertexColors为NULL影响_copyFromMe.mesh.vertexColors的值为NULL或不为NULL。 – 2010-04-01 16:22:00

+3

@Ilya为了给出一个完整的解释,我们不得不看看你是如何使用这个类的,但我猜测你正在做的是你不期望的副本。另外,如果你有一个拷贝构造函数,你几乎肯定需要一个赋值操作符和一个析构函数。 – 2010-04-01 16:28:21

+2

@伊利亚:它不会那样影响它。会发生什么是你复制你的对象不止一次(隐式或显式)。首先,通过复制在指针中创建一个垃圾值对象,然后再尝试复制该“垃圾”对象。 – AnT 2010-04-01 16:32:05

6

代码不完整,但我可以做出一个猜测。

当构造使用上述拷贝构造函数和源对象MeshObject类的对象在其mesh.vertexColorsNULL,新对象的mesh.vertexColors将含有垃圾,因为你不初始化它。

例如

MeshObject a; 
// `a.mesh.vertexColors` is NULL 

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

你需要在拷贝构造函数初始化mesh.vertexColors在所有情况下,不仅当源不为空。

3
MeshObject o1;  // vertexColor is NULL 
MeshObject o2(o1); // vertexColor is undefined 
MeshObject o3(o2); // BOOM! 
2

基本上,当你的拷贝构造函数被调用时,它不会调用正常的构造函数。复制构造函数必须将指针初始化为与正常构造函数相同的NULL。否则,它具有随机值,因为您正在使用未初始化的内存。一个体面的编译器应该给你一个关于这个的警告或错误。

1

为了搭载别人的说法,作为一般规则,我会初始化所有成员的拷贝构造函数,我在非拷贝构造函数中初始化,除非有一些令人信服的理由不这样做。我不记得上次有这样一个原因。