关于指针释放的有关问题
发布时间:2011-06-28 21:47:17 文章来源:www.iduyao.cn 采编人员:星星草
关于指针释放的问题
我自己总结了一下
关于c++的对象指针由如下几种方式可以获得
情况1. A *a = new A;
使用这种方式,在使用完a以后直接调用delete a来释放指针。
情况2.
A* GetA()
{
return new A();
}
A *a = GetA();
其中a是函数GetA所生成的,在使用完成后也应该用delete a来释放。
情况3.
class B
{
A* a;
A* GetA(){return a};
}
B b;
...
A *a = b.GetA();
这种情况下,B的GetA返回了它自己的成员变量,那在a使用完以后是不是应该也用delete a来释放呢?还是在B中用析构函数来释放。
另外对于第二种情况,又会出现下面的方式,我们称它为 情况4
class B
{
A* GetA(){return new A()};
}
B b;
...
A *a = b.GetA();
当然,如果B是我自己写的没有问题,我知道谁该释放这个指针。但是,如果B是别人写的,那我怎么来判断这个类是属于情况3还是情况4,或者在实际写程序的方式应该遵循某些原则。
------解决方案--------------------
最好做引用计数,不用时release,当计数为0时,delete掉
------解决方案--------------------
情况三四,得看具体情况了,自己规定.谁创建,谁删除
------解决方案--------------------
谁申请,谁释放
new的用delete
new []的用delete []
get的用return,
create的用destory
谁提供get/create,谁就得负责提供return/destory
当然,使用boost::shared_ptr会让代码轻松很多。
------解决方案--------------------
情况三四,得看具体情况了,自己规定.谁创建,谁删除
---------------------------------------------
同意这个。谁创建谁删除,分工不同的程序员不应该把new留给别人去删除。而且上new,delete最好不放在两个函数中(类的构造函数和析构函数例外)。
而且delete只要遵循一个规则,那就是去delete由new出来的东西,其他不用考虑。
A *a = b.GetA();//这个由编译器考虑,
A *a = b.GetA();//这无疑是很危险的行为,把两个或两个以上指针指向了同一个new出来的空间。释放很容易错误
------解决方案--------------------
B的设计者有义务告诉B的使用者,GetA的返回对象的归属于谁。由归属者完成delete的工作。
所以,对于return new A的情况,类库的文档是必须说明的(换句话说,如果没有说明,应该就是由B自己处理了)
就函数名称而言,一般约定:GetA表示访问语义,CreateA表示构造语义,前者不用使用者管理返回对象,后者需要。
正如楼上几位所说,谁创建谁删除是比较好的。构造器或其他特殊情况除外。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
身为程序员一定要学C吗?还是直接学其他语言就可以了?
本来有javascript基础.
但想学c++或者c#.不知道从何开始.
有一次在某网站看...
-
有用双屏幕开发的吗?
RT,本人新手,昨天公司发了个大屏幕的显示器,本来是笔记本,结果我双屏幕切换时把两个显卡驱动都禁用了,两个显示器...
-
急!Microsoft Visual Studio 2010图标显示问题!
一开始我是把VS的那个无穷大似的图标锁定在任务栏里的,后来解锁了,然后桌面上、开始...
-
AIX下如何得知一个文件是否被进程打开?
问题可以参考
http://topic.csdn.net/u/20110809/23/d4d8db23-07eb-4ac3-b212-c5a010820c...
-
推荐一款2000左右的智能机
RT~
------解决方案--------------------
merry christmas
------解决方案--------------------
小...
-
关于 % 的小问题,求解
有这样一句提示信息:
printf("n请输入一个型如2+3*(4+5)-3^2%4*6/2的表达式n");
但在运行后输出是:
请输入...
-
新手求助
大家好,鄙人刚来,菜鸟一个,想知道如何下载别人上传的资源,为什么没有下载链接,是需要一定的分数才能下载还是怎么回事?希望好...
-
CSDN有搜索自己发言或者某人发言的功能吗
请指教
------解决方案--------------------
没有。。。
------解决方案------------...
-
订到2张回成都的车票, 不容易啊, 散分
12点左右就每5分钟刷一次, 从13号到16号就一直只有无坐...
13:55 刷出3张硬卧, 大喜, 结...
-
计算机专业大四应该学点什么东西呢?
我现在的情况是已经保研,计算机专业专业硕士。现在大四上半学期快结束了,寒假和下学期除了毕业...