关于boost::shared_ptr只能指针的转换

redoffice 2008-01-16 09:44:35
先描述一下背景:

View的构造函数1:(在做操作一的时候调用构造函数1)

View::View(Doc& rDocument, Window *pWindow,const SwViewOption *pNewOpt, OutputDevice *pOutput,long nFlags )

pLayout( 0 )在这里初始化,pLayout( 0 )为View的成员,类型为 Frame *pLayout(Frame为另外一个类)

void View::Init( const ViewOption *pNewOpt )
在此函数中对pLayout进行new操作
pLayout = new Frame( pDoc->GetDfltFrmFmt(), this );
操作完成后,文档中的这个View就有了它的pLayout。


View的构造函数2:(在做操作二的时候调用构造函数2)

View::View( View& rShell, Window *pWindow,
OutputDevice *pOutput, long nFlags ) :


此时的pLayout为0;初始化,又构造一个View(这个View是做了操作二后产生的临时的View)
void View::Init( const SwViewOption *pNewOpt )
在此函数中对pLayout进行new操作
pLayout = new Frame( pDoc->GetDfltFrmFmt(), this );
操作完成后,文档中的这个临时的View就有了它的pLayout。

执行操作三:析构
析构的时候:

View::~View()
在析构里执行delete pLayout; 析构了它自己的pLayout

问题是:对于pLayout = new Frame( pDoc->GetDfltFrmFmt(), this );这个语句,产生的pLayout 是同一个pLayout ,也就是说,对于一个View和一个临时的View来说,两个pLayout 是一样的。因此,现在要使用boost::shared_ptr这种智能指针来转换这个pLayout ,使其变成一个共享的引用指针来指向同一个pLayout 而避免初始化出两个一样的pLayout 。

各位大侠,小弟看了不少boost::shared_ptr的相关文章,可惜没学会怎么用。请指点啊
...全文
238 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
taodm 2008-01-16
  • 打赏
  • 举报
回复
让GetLayout函数来管理pLayout的构建和析构即可。
不要自找麻烦地使用智能指针。
redoffice 2008-01-16
  • 打赏
  • 举报
回复
这样吧,抛开new的问题
就单独把Frame *pLayout 这个类型的指针 变成 boost::ptr 类型的共享指针怎么变?

变完了之后存在的问题怎么解决?

比如有一个函数 Frame* GetLayout(){ return pLayout;}

修改后调用这个类型怎么办?调用这个函数需要这个类型的函数是不是都要修改?
calss_cyl 2008-01-16
  • 打赏
  • 举报
回复
"对于pLayout = new Frame( pDoc-> GetDfltFrmFmt(), this );这个语句,产生的pLayout 是同一个pLayout ,也就是说,对于一个View和一个临时的View来说,两个pLayout 是一样的。"
没有看懂哎。
taodm 2008-01-16
  • 打赏
  • 举报
回复
你如何得到这个指针?
redoffice 2008-01-16
  • 打赏
  • 举报
回复
是共享一个指针,引用指针啊
boost认识
taodm 2008-01-16
  • 打赏
  • 举报
回复
你试图如何去获取那个已经存在的pLayout指针?
shared_ptr恐怕对你的问题没有帮助。
redoffice 2008-01-16
  • 打赏
  • 举报
回复
对,现在是两次new,但是使用完boost::shared_ptr以后就是一个了
taodm 2008-01-16
  • 打赏
  • 举报
回复
2次new怎么可能得到同一个对象呢?
redoffice 2008-01-16
  • 打赏
  • 举报
回复
嗯,我知道怎么搞了, Frame* GetLayout(){ return pLayout;} 这个应该改成pLayout.get()
因为pLayout本身的类型已经改变,但是pLayout.get()得到了Frame类型
这样处理的话就OK了,是boost本身的东西。不容易啊
redoffice 2008-01-16
  • 打赏
  • 举报
回复
不行啊,那样的话就不能完成下一步的工作了
...
C++智能指针详解 智能指针详解 智能指针内容很多,重点是基本⽤法。 #include <boost/shared_ptr.hpp> class CBase: public boost::enable_shared_from_this { public: virtual void f(){}//必须有个虚函数才能向上向下转换。 } typedef boost::shared_ptr CBasePtr; class CChild: public CBase {} typedef boost::shared_ptr CChildPtr; void main() { CBasePtr ptrBase = boost::make_shared(); //CBasePtr ptrBase = CBasePtr(new CBase()); // 向下转换 CChildPtr ptrChild = boost::dynamic_pointer_cast(ptrBase); // 向上转换 CBasePtr ptrXXX = ptrChild; // 普通转换 CChildPtr ptrXX = CChildPtr(dynamic_cast(ptrXXX.get())); } 暂时学会这些⽤法即可。 url: C++ 智能指针详解 ⼀、简介 由于 C++ 语⾔没有⾃动内存回收机制,程序员每次 new 出来的内存都要⼿动 delete。程序员忘记 delete,流程太复杂,最终导致没 有 delete,异常导致程序过早退出,没有执⾏ delete 的情况并不罕见。 ⽤智能指针便可以有效缓解这类问题,本⽂主要讲解参见的智能指针的⽤法。包 括:std::auto_ptrboost::scoped_ptrboost::shared_ptrboost::scoped_array、、boost::weak_ptrboost::intrusive_ptr。你可能会想,如 此多的智能指针就为了解决new、delete匹配问题,真的有必要吗?看完这篇⽂章后,我想你⼼⾥⾃然会有答案。 下⾯就按照顺序讲解如上 7 种智能指针(smart_ptr)。 ⼆、具体使⽤ 1、总括 对于编译器来说,智能指针实际上是⼀个栈对象,并⾮指针类型,在栈对象⽣命期即将结束时,智能指针通过析构函数释放有它管理的 堆内存。所有智能指针都重载了"operator->"操作符,直接返回对象的引⽤,⽤以操作对象。访问智能指针原来的⽅法则使⽤"."操作符。 访问智能指针包含的裸指针则可以⽤ get() 函数。由于智能指针是⼀个对象,所以if (my_smart_object)永远为真,要判断智能指针的裸指 针是否为空,需要这样判断:if (my_smart_object.get())。 智能指针包含了 reset() ⽅法,如果不传递参数(或者传递 NULL),则智能指针会释放当前管理的内存。如果传递⼀个对象,则智能指 针会释放当前对象,来管理新传⼊的对象。 我们编写⼀个测试类来辅助分析: class Simple { public: Simple(int param = 0) { number = param; std::cout << "Simple: " << number << std::endl; } ~Simple() { std::cout << "~Simple: " << number << std::endl; } void PrintSomething() { std::cout << "PrintSomething: " << info_extend.c_str() << std::endl; } std::string info_extend; int number; }; 2、std::auto_ptr std::auto_ptr 属于 STL,当然在 namespace std 中,包含头⽂件 #include 便可以使⽤。std::auto_ptr 能够⽅便的管理单个堆 内存对象。 我们从代码开始分析: void TestAutoPtr() { std::auto_ptr my_memory(new Simple(1)); // 创建对象,输出:Simple:1 if (my_memory.get()) { // 判断智能指针是否为空 my_memory->PrintSomething(); // 使⽤ operator-> 调⽤智能指针对象中的函数 my_memory.get()->info_extend = "Addition";

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧