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 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员