谈谈C++内存越界问题及解决方法
与内存泄漏相比,C++最麻烦的问题是内存越界,这往往是由于挂指针造成的。
假设一个指针变量:
Object * ptr;
使用ptr时,不仅要判断ptr是否为0,还要怀疑它指向的对象是否有效,是否在别处被破坏过。我们希望当ptr指向的对象被销毁时,ptr自动设置为0。
很明显,C++没有这种机制,但借助boost::weak_ptr可以做到。
inline void null _ deleter(void const *)
{
}
X类
{
私人:
shared _ ptr this _
int I _;
公共:
explicit X(int i): this_(this,&null_deleter),i_(i)
{
}
X(X const & rhs): this_(this,&null_deleter),i_(rhs.i_)
{
}
X & operator =(X const & RHS)
{
I _ = RHS . I _;
}
weak _ ptr weak _ this()const { return this _;}
};
变量:
weak _ ptr ptr = x . weak _ this();// x是一个x对象。
然后当x被销毁时,ptr自动设置为无效。用法如下:
if(shard _ ptr safe ptr = ptr . lock())safe ptr-> do _ something();
这个方法用在单线程中,因为X对象可能是基于堆栈分配的。如果需要在多线程中访问X对象,那么最好的方法是使用shared_ptr来管理对象的生命周期。这样对于safePtr来说,可以保证它所指向的对象在safePtr的生存期内不会被其他线程删除。
位律师回复
0条评论