C++指针内存释放问题

定义了一个类:classmyClass{public:myClass():ptr(NULL){}myClass(float*in):ptr(in){}private:fl... 定义了一个类:
class myClass
{
public:
myClass():ptr(NULL){}
myClass(float* in):ptr(in){}
private:
float* ptr;
}

指针ptr的值 不是由类成员函数指定;
而是从外部传入;
如:float v = 1.223f;
float* p = &v;
myClass instance(p);
delete p;

请问,需不需要在类myClass的析构函数里添加"delete ptr;"来释放ptr指向的内存?

还有delete是释放指针本身还是指针指向的内存?还是都释放?
展开
 我来答
泡影果果616
推荐于2016-04-15 · 知道合伙人软件行家
泡影果果616
知道合伙人软件行家
采纳数:2005 获赞数:71335
软件技术从上学的时候就在研究,虽没最强大脑那般无敌,但依靠后天的勤奋学习,相信可以很专业的帮助更多人

向TA提问 私信TA
展开全部
C++中指针在new和delete操作的时候对内存堆做的如下
1、指针的new操作:
指针在new之后,会在内存堆中分配一个空间,而指针中存放的是这个空间的地址。如:
void main(){
int *p = new int(4);
cout << p << endl;
cout << *p << endl;
}
输出为:
0x00431BF0
4
分别为分配的空间地址和地址内存放的值。
如果写为:
void main(){
int *p = new int(4);
cout << *(int *)0x00431BF0 << endl;
}
输出为:4
程序的意思就是将0x00431BF0内存地址开始的4个byte的块取出转换为int类型输出,即直接读取内存。
2、指针的delete操作:
指针在delete的时候,会将指针指向的内存区域释放掉,而指针同内存区域的联系并没有被切断,仍然会只想原来指向的内存区域。如:
void main(){
int *p = new int(4);
cout << p << endl;
cout << *p << endl;
delete p;
cout << p << endl;
cout << *p << endl;
}
程序输出:
0x00431BF0
4
0x00431BF0
-572662307
可以看到p前后指向的地址是相同的,而指向地址的内存区域被释放。
3、空指针:
空指针指向的内存区域为内存的首地址,是不可读写的区域,即空指针不提供操作。删除空指针是安全的(因为它什么也没做)。所以,在写构造函数,
赋值操作符,或其他成员函数时,类的每个指针成员要么指向有效的内存,要么就指向空,那在你的析构函数里你就可以只用简单地delete 掉他们,而不用
担心他们是不是被new 过。如:
void main(){
int *p = NULL;
cout << p << endl;
} //输出0x00000000
4、取出内存区域的值
在取某内存地址开始的一个区域的值的时候,取出的值取决于用来取值的类型,譬如int为4个byte,char为1个byte,程序如:
void main(){
int a[2] = {261,0};
int *pi = a;
char *p = (char*)pi;
cout << *(int *)p++ << endl; //取出p地址,转化为取4个byte,并取出内容,之后p向后移动一位
cout << *(int *)p << endl; //取出p地址,转化为取4个byte,并取出内容
cout << (int)*p << endl; //取出1个char类型,并转换为int型
cout << (int)*(char *)pi << endl; //取出pi地址,转换为char类型,取出内容,并转换为int型
}
程序输出:
261
1
1
5
a的存储区域安排为:byte1=5,byte2=1,byte3~byte8 = 0;
所以*(int *)p++取的为byte1到byte4; 之后的*(int *)p取的是byte2到byte5;
(int)*p取的是byte2;(int)*(char *)pi取的是byte1,之后转换为int型。
wanfustudio
2009-04-29 · TA获得超过1万个赞
知道大有可为答主
回答量:5513
采纳率:100%
帮助的人:3724万
展开全部
不需要delete
因为没有通过new来申请空间

只有这样的才需要delete

float *p = new float;
这样传入的才需要delete
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhjiemm
2009-04-29 · TA获得超过2643个赞
知道大有可为答主
回答量:1834
采纳率:75%
帮助的人:703万
展开全部
还有delete是释放指针本身还是指针指向的内存?还是都释放?

是释放指针指向的内存。

但你这个p,没有申请内存。 所以用不着释放。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tnt230
2009-04-29 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:136
采纳率:0%
帮助的人:112万
展开全部
谁说这里要delete指针?只有在动态开辟内存的时候才需要释放
还有delete当然是释放内存!!!
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chichujn
推荐于2018-03-02 · TA获得超过663个赞
知道小有建树答主
回答量:1534
采纳率:50%
帮助的人:1098万
展开全部
需不需要在类myClass的析构函数里添加"delete ptr;"来释放ptr指向的内存
==============================================
这个要看程序到底是什么意图.需要在myClass对象销毁以后就停止对ptr指向内存的读写那可以加delete p;(最好还好在前面加if(!p) )但这不是好的做法.因为p指向的内存不是myClass类分配的.myClass析构函数用到delete p;时不能保证p的有效性.C++的遵循的规则是谁用谁分配,谁分配谁销毁.

delete p;语句的意思是将指针p所指对象的内存交还给系统.这片内存必须是动态内存(堆)上分配的.
但是p本身还是指向这片内存的.对p解引用仍然可以访问这片内存.所以在delete p;以后最好再加上一句
p = NULL;
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式