C++类的实例赋值BUG (深浅拷贝问题)

发布于 2019-12-25  276 次阅读


前言

最近在写类的时候遇到了一个大bug, 类实例变量赋值的时候导致程序崩溃
问题就出在了堆内存的深拷贝和浅拷贝上, 本文不会臭屁一堆, 直接上图通俗易懂的讲解到底怎么回事

浅拷贝

浅拷贝的意思是, 只拷贝地址指向, 讲人话就是, 我把你申请的堆内存地址拿过来给我自己用了

浅拷贝在内存中的情况

而细心的人可能就发现问题了, 函数退出, t1和t2开始执行析构函数, 同一块堆内存会被free两次!

但是为什么会浅拷贝呢?
因为c++编译器都会默认的给加上 =符号 的重载, 也就是说, t2 = t1 实际上是这样的 t2.operator=(t1)
为了避免浅拷贝导致free同一块内存多次, 所以需要开发人为的重写 = 符号重载

深拷贝

深拷贝的意思是, 拷贝多一份新的副本, 讲人话就是, 我把你堆内存中的内容扒拉过来给我自己用

深拷贝在内存中的情况

可以看到在内存中已经申请了两块堆内存, 所以并不会出现 多次free同一块内存 这种bug

总结

在写C++类的时候, 需要额外注意成员变量是否用到了堆内存, 如果用到了必须重写 = 符号重载, 避免遇上深浅拷贝导致的bug(因为这种bug是真的难找T_T)


一位被疯狂压榨的底层工作人员