c++析构函数是怎么释放内存的?
我有一个类1里面有个方法1里有一指针在方法1中开始时new了方法1结束时delete了,然后我在另一个文件的方法2中实例化这个类1,使用结束后,在这个方法2结束时程序挂掉...
我有一个类1 里面有个方法1里有一指针 在方法1中开始时new了 方法1结束时delete了,然后我在另一个文件的方法2中实例化这个类1,使用结束后,在这个方法2结束时 程序挂掉了 。跟踪了一下是在类1的析构函数中挂掉了。我把方法1里的指针换成对象就不会挂了,这是为什么呢?
int C1::f1()
{
C3 * c3 = NULL;
c3 = new C3();
delete c3;
return 1;
}
C1::C1()
{
}
C1::~C1()
{
}
//在另一个文件中
int C2:f2()
{
C1 c1;
c1.f1();
return 1;
}
return时挂掉 展开
int C1::f1()
{
C3 * c3 = NULL;
c3 = new C3();
delete c3;
return 1;
}
C1::C1()
{
}
C1::~C1()
{
}
//在另一个文件中
int C2:f2()
{
C1 c1;
c1.f1();
return 1;
}
return时挂掉 展开
展开全部
自动生成的只会原样复制。如果你掘模的类里有一个指针,你给它分配了内存,然后在析构函数中释放内存。如果使用自动生成的复制函数会造成隐散袭重复释放内存。
如果我用了new来分配内存 我又使用了 析构函数来释放内存 会怎样呢?
class C
{
public:
C() : p( new char[ 100 ])
{}
~C()
{
delete[] p;
}
private:
char *p;
};
C a;
C b(a); //这里使用系统生成的拷贝构造函数。a.p 与b.p是相同的。a和b的析构函数都会删除灶兄p,就会重复删除而出错。
如果我用了new来分配内存 我又使用了 析构函数来释放内存 会怎样呢?
class C
{
public:
C() : p( new char[ 100 ])
{}
~C()
{
delete[] p;
}
private:
char *p;
};
C a;
C b(a); //这里使用系统生成的拷贝构造函数。a.p 与b.p是相同的。a和b的析构函数都会删除灶兄p,就会重复删除而出错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
关于析构函数的说明:
1。当程序的执行离开实例化自动对象所在的作用域时,自动对象就会撤销,这时析构函数隐式调用.并不是说在main函数腔并结束时才执行。
2。析构函数本身并不释放对象占用的内存空间,它只是在系统收回对象的内存空间之前执行扫尾工作.析构函数体内并不一定要有delete语句。可以有也可以没
3。和构造函数一样,每个类都有一个析构函数,即使没有显式提供一个析构函数,编译器也会生成一个空的析构函数 .
补充说陆吵明:
离开实例化自动对象所在的作用域这句的意思就是说比如你有一个自定义类和一个自定义伍悉迹函数,你在这个函数里声明一个这个类的对象,这个对象就是实例化自动对象,它的作用域仅限于该函数体内,然后你在main函数里调用这个函数,调用结束后,那个类的对象就离开了它的作用域,这时,那个类的析构函数就会被编译器隐式调用。
当主函数结束,回收内存的工作就开始了,但这个工作是由编译器的内存回收机制在后台执行。如果在类的实现中,有动态分配内存和动态分配数组的语句,那么最好在析构函数里提供delete语句!
更正二楼的一个观点,析构函数绝不是在main函数结束时自动执行的!!!!!!
1。当程序的执行离开实例化自动对象所在的作用域时,自动对象就会撤销,这时析构函数隐式调用.并不是说在main函数腔并结束时才执行。
2。析构函数本身并不释放对象占用的内存空间,它只是在系统收回对象的内存空间之前执行扫尾工作.析构函数体内并不一定要有delete语句。可以有也可以没
3。和构造函数一样,每个类都有一个析构函数,即使没有显式提供一个析构函数,编译器也会生成一个空的析构函数 .
补充说陆吵明:
离开实例化自动对象所在的作用域这句的意思就是说比如你有一个自定义类和一个自定义伍悉迹函数,你在这个函数里声明一个这个类的对象,这个对象就是实例化自动对象,它的作用域仅限于该函数体内,然后你在main函数里调用这个函数,调用结束后,那个类的对象就离开了它的作用域,这时,那个类的析构函数就会被编译器隐式调用。
当主函数结束,回收内存的工作就开始了,但这个工作是由编译器的内存回收机制在后台执行。如果在类的实现中,有动态分配内存和动态分配数组的语句,那么最好在析构函数里提供delete语句!
更正二楼的一个观点,析构函数绝不是在main函数结束时自动执行的!!!!!!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询