2013-08-18 28 views
1

我在我的项目中使用了普通的指针。我有一些内存问题,并改变了weak_ptr的普通指针。我有错误:weak_ptr <User_Class>是无指针类型

错误:基础操作“ - >”具有非指针型“的boost :: weak_ptr的”

为什么?我该怎么办?

+1

不要用['标准:: weak_ptr'(HTTP://en.cppreference。 com/w/cpp/memory/weak_ptr)。使用['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)或['std :: shared_ptr'](http://en.cppreference.com/w/ CPP /存储器/ shared_ptr的)。如果你阅读了'std :: weak_ptr'的链接引用,你将会明白为什么。 –

回答

3

您不想使用std::weak_ptr<T>来保存内存。实际上,它用于尽快释放内存,同时能够在其他位置使用时检索对象。根据您的所有权语义,您希望为对象的单个所有者使用std::unique_ptr<T>,或者为对象的共享所有权使用std::shared_ptr<T>

std::weak_ptr<T>的想法是,您可能需要找到对象,如果它们确实存在但您不想牢牢地粘在这些对象上。也就是说,如果没有其他所有者,即std::shared_ptr<T>,则该对象被释放,尽管存在指向它的std::weak_ptr<T>。然而,std::weak_ptr<T>获知正在发布的另一个对象。要使用std::weak_ptr<T>指向的对象,在确定它确实指向一个仍然存在的对象后(如果将std::weak_ptr<T>引用的对象转换为不存在时将其转换为std::shared_ptr<T>)一个std::shared_ptr<T>,抛出异常)。

相同的语义适用于这些类模板的Boost版本:标准类模板在Boost之后建模。

+0

...只记得这一点:'weak_ptr'不是一个指针(尽管它的名字)。 –

1

首先,锁定的weak_ptr - 如果它没有过期,你会得到相应的shared_ptr

shared_ptr<my_type> p = weak.lock(); 
if (p) 
    p->do_something(); 
else 
    // expired!