operator=——不能忽视的运算符(sina博客移入)

昨天在做图像处理的东西,要实现图片的缩放和平移。处理的算法不是很难,但是测试的时候发现缩小之后图片只有下面一半能够显示,放大的时候只有上面一般正常。

首先调试图像处理的算法,看了半天没有错误,另外一半的像素是能够访问到的,倒是取出来的时候已经有问题了。再调试像素获取的部分,也不太会不正常,毕竟有一半的像素获取是正常的。

花了很长时间,终于发现了问题的所在。在加载了bmp图片之后,我把加载的图片通过赋值运算符(operator=)复制了一份,原始的作为存档,已方便恢复初始状态。但是bmp加载的类里面没有重载operator=这个运算符,因此使用了默认的复制方式。默认的复制方式不会将指针指向区域内存的值进行复制,而是简单的复制了指针地址,也就是说虽然复制了一份bmp图像数据,但是在操作的时候修改的是同一块内存区域,导致前面的修改影响到了后面的读取。

解决方法就是自己重载operator=,把里面的指针全部用memcpy函数复制内存数据,这样才真正坐到了保留了一个副本。看来以后类的私有变量里有指针的都要考虑到这个问题啊。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据