首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于指针释放的有关问题

2012-03-21 
关于指针释放的问题我自己总结了一下关于c++的对象指针由如下几种方式可以获得情况1.A*anewA使用这种方

关于指针释放的问题
我自己总结了一下
关于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表示构造语义,前者不用使用者管理返回对象,后者需要。

正如楼上几位所说,谁创建谁删除是比较好的。构造器或其他特殊情况除外。

热点排行