我有一个带有成员变量的场景类Image ** images,int * xcoords,int * ycoords。现在,我正在尝试重载我的=运算符。
我收到以下内存错误(使用valgrind)
Conditional jump or move depends on uninitialised value(s)
==6439== at 0x406FCA: Scene::drawscene() const (scene.cpp:160)
==6439== by 0x4084C1: main (testscene.cpp:50)
上面提到的那条线(scene.cpp:160)是
if (images[i]!=NULL)
所以他们说图像没有初始化。
所以其他任何地方都调用了drawcene()并没有引起任何问题,但我认为因为使用了=运算符,所以它引起了一个问题。
任何人都可以在我的代码中看到可能导致此错误的任何问题吗?
答案 0 :(得分:3)
你需要这个:
if(source.images[i]!=NULL) {
images[i]=new Image;
*images[i]=*source.images[i];
xcoords[i]=source.xcoords[i];
ycoords[i]=source.ycoords[i];
} else {
images[i] = NULL;
}
这将解决您的直接问题。但实际上,你是以错误的方式解决这个问题。正如@Gman所说,您应该使用copy-and-swap idiom。
使用这个习语的原因是异常安全。如果某个东西在operator =
的中间抛出一个异常(并且有很多东西可以,因为它做了这么多)你将使对象处于未定义状态,这非常糟糕。复制和交换习惯用法可以编写异常安全的复制构造函数(这仍然有点棘手),然后利用它来构建赋值运算符。
作为额外的奖励,您将获得一个工作副本构造函数和swap
函数。复制构造函数非常便于在STL容器中填充内容并按值传递或返回内容。 swap
函数对于类的用户来说非常有用,特别是那些想要实现自己的异常安全拷贝构造函数和赋值运算符的用户。
答案 1 :(得分:0)
如果images[i]
为非NULL,则只初始化source.images[i]
。如果source.images[i]
为NULL,则在images[i]