weixin_40666372 2019-03-04 11:17 采纳率: 100%
浏览 303
已采纳

最近在做一个项目,然后发现了一个奇怪的问题,让我百思不得其解,看来我对C++的理解还是太年轻了

typedef struct Text2
{

int* a;

Text2()
{
    a=NULL;
}
~Text2()
{
    if (a)
    {
        printf("a:%d\n",a);
        printf("a0:%d\n",a[0]);//这3个主要用来观察a的地址和值
        printf("a1:%d\n",a[1]);
        if (a)
        {
            delete[] a;
            a=NULL;
        }
    }
}
    Text2(const Text2& t)//
{
    a=new int[2];
    a[0]=t.a[0];
    a[1]=t.a[1];
}这个拷贝构造函数在运行的时候根本不会被执行,为什么?
    Text2& operator=(const Text2& t)
{
    a=new int[2];
    a[0]=t.a[0];
    a[1]=t.a[1];
    return *this;
}重载也不行,和上面一样,断点都无法进来,提示没有与此关联的可执行代码

}Text2;

typedef struct Text1
{

Text2* t2;

Text1()
{
    t2=NULL;
}
~Text1()
{
    if (t2)
    {
        printf("t2:%d\n",t2);
        delete[] t2;
        t2=NULL;
    }
}
Text1(const Text1& t)
{
    t2=new Text2[2];
    t2[0].a=new int[2];//这两个分配内存好像没用?跟踪第二次delete发现a的地址和第一次的相同
    t2[1].a=new int[2];
    memcpy(t2,t.t2,sizeof(Text2)*2);
}

}Text1;

list text;

int main()
{

Text1 text1;
text1.t2=new Text2[2];
text1.t2[0].a=new int[2];
text1.t2[0].a[0]=1;
text1.t2[0].a[1]=2;

text1.t2[1].a=new int[2];
text1.t2[1].a[0]=3;
text1.t2[1].a[1]=4;
text.push_back(text1);

printf("a0:%d,a1:%d\n",text.front().t2[0].a[0],text.front().t2[0].a[1]);

printf("a0:%d,a1:%d\n",text.front().t2[1].a[0],text.front().t2[1].a[1]);

return 0;//拷贝进链表后,执行到这里后会进行一次析构

}//结束后,会再进行一次析构

在做项目的时候发现总有个地方奔溃,于是写了一个简单的程序测试一下,但是发现问题能奇怪,由于要把结构体放进链表,考虑到浅拷贝的问题,一开始我在Text2这个结构体写拷贝构造函数,但是发现程序根本不会执行到这里来。后来在Text1写拷贝构造函数,但是好像又无法分配Text2里面a指针的内存,在进行2次delete之后,依旧会报错,为什么会这样,应该要怎么样去处理才行?真是一个奇怪的问题,对C++的理解还是太年轻了

  • 写回答

1条回答 默认 最新

  • minihowto 2019-03-04 12:32
    关注

    你没有触发拷贝构造, 注意区分缺省构造、拷贝构造和赋值构造。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作