最近在做一个项目,然后发现了一个奇怪的问题,让我百思不得其解,看来我对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++的理解还是太年轻了
答
你没有触发拷贝构造, 注意区分缺省构造、拷贝构造和赋值构造。