读书人

std:auto_ptr与裸指针解决办法

发布时间: 2013-02-17 10:44:46 作者: rapoo

std::auto_ptr与裸指针
最近遇到一个问题,在只能用智能指针auto_ptr的情况下,而且裸指针会传出去,酱紫感到会有风险,野指针和内存泄露的问题,好吧,看代码:

#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>
#include <memory>
using namespace std;

class Base1
{
virtual void Read()=0;
};
class Derived1
:public Base1
{
public:
Derived1():m_Data(0)
{
}
void Read()
{
std::cout << m_Data << std::cout;
}
private:
int m_Data;
};

class Base2
{
public:
virtual void Write()=0;
};
class Drived2:public Base2
{
public:
Drived2():m_pBase1(new Derived1())
{
}
Base1* GetBase1(){return m_pBase1.get();}
void Write(){}
private:
auto_ptr<Base1> m_pBase1;
};
int main()
{
Drived2* lpDerived2 = new Drived2();
Base1* lpBase1 = lpDerived2->GetBase1();
return 0;
}

大家有什么好的建议吗?
PS:不用其他只能指针。不过最近看到weak_ptr和shared_ptr搭配用灰常爽。奈何现在要自己管理指针。
[解决办法]
你的指针目的是在外面销毁还是在类内部销毁。。你既然把指针传递出去了,那么是否就是说,由外面管理(销毁呢)那么你就内部不要用智能指针了。如果你还想内部销毁,那么就要保证外部使用周期一定要小于类的生命周期了。
[解决办法]
如果由内部销毁,还想保证安全,你不如传递指针的指针。使用时,判断(*ptr)是否等于NULL.
[解决办法]
我觉得你说的两个问题应该调用者本身要注意的问题,生命周期和循环引用:
引用:一定要以指针形式?一般我比较倾向使用引用,把返回值类型改成引用如何?
C/C++ code?1Base1& GetBase1(){return *(m_pBase1.get());}
改成引用倒是挺好的,不过要注意初始指针的生命周期最大;
另外还有循环引用的问题,这个问题也比较棘手。

读书人网 >C++

热点推荐