读书人

关于指针释放的有关问题

发布时间: 2012-03-21 13:33:15 作者: rapoo

关于指针释放的问题
我自己总结了一下
关于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++

热点推荐