专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > C++

关于指针释放的有关问题

发布时间: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表示构造语义,前者不用使用者管理返回对象,后者需要。

正如楼上几位所说,谁创建谁删除是比较好的。构造器或其他特殊情况除外。
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: