由于之前程序里的一个BUG,导致返回的临时对象里的char*成员指向的内存其实已经被释放了。

当我使用这个临时对象给另外一个新对象赋值时,首先需要给新对象申请空间,我惊奇的发现,新new申请的内存地址和临时对象的那个char*成员的值相同。

想了一想,猜测是以下原因:由于new申请的内存都在堆中,在距离上次释放内存之后没有新申请内存,所以再次申请内存的时候按顺序申请,自然地址从上次释放的起始位置开始,自然和之前的那个指针值相等。

看似巧合,实际有必然性。
经过一天多的调试,证明对于使用动态分配内存成员的类来说,复制构造函数和对等号的重载是第一重要的。

以前做东西总是避免使用动态分配的内存,最近要做一些关于大数的东西,决定使用动态分配的一块内存存放我的大数,结果导致的问题一天才解决。

刚开始没有重载等号和定义复制构造函数,结果总是在程序运行的最后报一个堆错误,经过跟踪发现问题发生在程序最后对象析构时有一块内存被释放两次。

看来不能偷懒,赶紧重载等号,结果发现问题依旧,郁闷之极。

多次跟踪程序后,发现在重载的加法运算最后。我重载的加法运算符最后返回一个临时对象,由于返回临时对象时有一个隐式的赋值过程,即将返回的局部变量赋值给临时对象。结果返回时局部变量析构,导致临时对象里成员的那块内存已经无效。

于是定义了复制构造函数,问题解决。。
由于安装了巨大的vs2008的缘故,系统盘剩余空间捉襟见肘。而之前预留的xp分区由于08r2兼容性的全面提升,已经废弃了,所以决定合并两个分区。

首先备份xp分区里的桌面和一些别的程序配置信息。

重启至U盘下的Linux。(吸取上次用Windows操作分区导致蓝屏和分区表丢失的教训,这次修改分区使用比较稳定的Linux。)
由于Linux所在的分区号大于要删除分区的分区号,所以无法使用电脑上的Linux来操作分区,所以需要使用U盘上的。

备份分区表:sudo fdisk /dev/sda -l > ~/parinfo.bak
然后用VI看一下是否成功导出了。若成功,发送至邮箱(放至U盘也可),注意不要放在硬盘上,试想硬盘分区表丢失后去哪里找这个备份来恢复。

启动GParted,图形化的,操作很傻瓜化,其实推荐命令行操作,不过既然有图形化的,我就懒得去用命令了,一旦敲错后果很严重。
照例拖来拖去,先卸载已挂载的所有分区号大于要删除分区的分区。然后删除分区,调整大小,扩大分区。(要删除的分区是个逻辑分区,而要扩大的分区是主分区,故不能直接合并)。成功后再次保存分区表。

重启至Windows下,会进行硬盘自检,完毕后进入系统,可看到分区已经扩大至30G。
分页: 1/1 第一页 1 最后页 [ 显示模式: 摘要 | 列表 ]