我有类BaseStream,以及创建新BaseStream的函数。另外我还有另一个带有BaseStream *字段的类。我怎么知道这个字段是否有效,因为BaseStream *的实例可以在某处删除
P.S。我不能使用std:和c ++ 11
答案 0 :(得分:5)
有两种解决方案。最强大的是使用Boehm 收集回收记忆;通过这种方式,你可以 使用可识别为已删除的内容覆盖对象 在析构函数中的对象,你保证了内存 只要指针指向它就不会被回收,所以你 可以在任何使用之前测试对象是否已被删除或 不
但是,一般来说,你应该避免这个问题;指某东西的用途 如上所述,Boehm收藏家应该是一个备用 测量和访问被破坏的对象应该被处理 作为内部软件错误,如断言失败。使用 观察者模式:任何具有指向对象的指针的代码 以观察者身份注册,对象通知他们 在它的析构函数中,所以他们可以重置指针(或删除它) 从地图或矢量,或他们必须做的任何事情)。
答案 1 :(得分:3)
三种选择:
使用观察者模式,以便在另一个对象即将被销毁时通知对象。
使用boost::shared_ptr
。
实现自己的智能指针类。
(1)实现起来很有趣,你可以根据应用程序的编写方式保留你可能认为必要的指针。 (2)可以工作(取决于我之前的评论),并且一旦你移植到C ++ 11,你就可以放入std::shared_ptr
。 (3)太多重新发明轮子和智能指针类很难正确。
答案 2 :(得分:0)
如果使用原始指针,则无法知道成员是否有效。当某个成员被删除时,“某处”访问它是未定义的行为。 这是使用共享和弱指针(解决您的问题)的好参数。如果您不能使用库库,请编写您自己的专用库。但是如果没有某种类型的包装器对象,则无法检查成员的有效性。