分析测试百科网

搜索

喜欢作者

微信支付微信支付
×

C++之拷贝构造函数的浅copy和深copy(三)

2020.9.28
头像

王辉

致力于为分析测试行业奉献终身

输出结果:

root@txp-virtual-machine:/home/txp# g++ test.cpp
root@txp-virtual-machine:/home/txp# ./a.out
t1.i = 2, t1.j = 3, t1.p = 0x1528010
t2.i = 2, t2.j = 3, t2.p = 0x1528010
*** Error in `./a.out': double free or corruption (fasttop): 0x0000000001528010 ***
Aborted (core dumped)

注解:出现了段错误,仔细分析,我们发现这里释放了堆空间两次(因为我们这里没有调用拷贝构造函数,也就是自己去写拷贝构造函数;所以这种情况是浅拷贝,不能释放两次堆空间):

wx_article_20200831000234_YTFrOA.jpg

代码版本二(加上拷贝构造函数):

#include <stdio.h>
#include <string>
class Test{
private:
  int i;
  int j;
  int *p;
public:
  int getI()
  {
     return i;
  }
  int getJ()
  {
     return j;
  }
  int *getP()
  {
     return p;
  }
  Test(int a)
  {
     i = 2;
     j = 3;
     p = new int;
     *p = a;
 }
 Test(const Test& t)
 {
   i = t.i;
   j = t.j;
   p = new int;
   *p = *t.p;
 }
 void free()
 {
   delete p;
 }
};
int main()

  Test t1(4);
  Test t2 = t1;
  printf("t1.i = %d, t1.j = %d, t1.p = %p", t1.getI(), t1.getJ(), t1.getP());
  printf("t2.i = %d, t2.j = %d, t2.p = %p", t2.getI(), t2.getJ(), t2.getP());
  t1.free();
  t2.free();
  return 0;


互联网
文章推荐