C++ 分配内存块问题 高手进
用New创建的类用不用delete???比如A是一个类,A*P=newA,最后会不会因为构析函数而不用deleteP?可是我在用new后再用delete,程序在delet...
用New 创建的类用不用delete???比如A是一个类,A * P=new A,最后会不会因为构析函数而不用delete P?
可是我在用new后再用delete,程序在delete那里停住了,不知怎么回事。。。 展开
可是我在用new后再用delete,程序在delete那里停住了,不知怎么回事。。。 展开
展开全部
1)new 创建的类,需要对应的delete才能删除,因为new分配的对象是保存在进程的堆内存中;
2)析构函数的调用需要delete才会触发调用(可以在debug调试模式下,切换到汇编代码分析,delete语句编译成的汇编代码里面,会调用析构函数的代码,new分配的对象,编译器无法自动编译出需要删除对象的代码,因为编译器无法判断new分配对象的作用域);
3)只有在栈上上分配的对象(如函数内定义:A a;),才会在函数退出时候,自动触发析构函数调用;(同样可以在debug模式下,切换到汇编代码观察,函数内的临时对象,会在函数退出时,自动调用对象的析构函数,这个是由编译器来自动编译实现的,因为编译器可以判断函数内临时对象的作用域是在函数内,因此编译器会在函数退出时候添加对象相应的析构函数代码,而且是遵循后进先出的原理,因为临时对象保存在线程的栈内存上,而不是在堆内存上);
2)析构函数的调用需要delete才会触发调用(可以在debug调试模式下,切换到汇编代码分析,delete语句编译成的汇编代码里面,会调用析构函数的代码,new分配的对象,编译器无法自动编译出需要删除对象的代码,因为编译器无法判断new分配对象的作用域);
3)只有在栈上上分配的对象(如函数内定义:A a;),才会在函数退出时候,自动触发析构函数调用;(同样可以在debug模式下,切换到汇编代码观察,函数内的临时对象,会在函数退出时,自动调用对象的析构函数,这个是由编译器来自动编译实现的,因为编译器可以判断函数内临时对象的作用域是在函数内,因此编译器会在函数退出时候添加对象相应的析构函数代码,而且是遵循后进先出的原理,因为临时对象保存在线程的栈内存上,而不是在堆内存上);
展开全部
1.用new分配的空间一定要有对应的delete来释放
2.构析函数并不会主动帮你把new出来的空间释放,如果你自己没有主动用delete去释放,还是会存在内存泄露的问题的
2.构析函数并不会主动帮你把new出来的空间释放,如果你自己没有主动用delete去释放,还是会存在内存泄露的问题的
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
必须要用delete释放new分配的内存空间,因为delete释放对象内存时,是释放的是栈内存,而new分配的是堆内存,所以一般在对象生存期结束之前,也就是
在析构函数中delete p
在析构函数中delete p
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
那是不可能的 除非你在 析构函数中释放
你把代码贴出来看看啊
你看看 这一点 没有问题的
#include <iostream>
using namespace std;
class A
{
public:
A(){ }
~A(){ }
};
void main()
{
A *p=new A;
delete p;
}
你把代码贴出来看看啊
你看看 这一点 没有问题的
#include <iostream>
using namespace std;
class A
{
public:
A(){ }
~A(){ }
};
void main()
{
A *p=new A;
delete p;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
delete一个对象,代表调用该对象的析构函数。
new分配的对象处于堆内存空间,堆内存空间内的数据需要手动释放,否则引起内存泄露。
new分配的对象处于堆内存空间,堆内存空间内的数据需要手动释放,否则引起内存泄露。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询