C++11 我们应该在什么时候对类memeber变量使用std::unique_ptr和std::shared_ptr?

C++11 我们应该在什么时候对类memeber变量使用std::unique_ptr和std::shared_ptr?,c++11,pointers,smart-pointers,C++11,Pointers,Smart Pointers,我知道std::unique\u ptr和std::shared\u ptr背后的一般理念。如果没有其他指针变量要求访问唯一指针指向的对象/基本数据,则应使用唯一指针。但是,存在一个共享指针,用于对单个资源(如文件)进行共享/并发访问 当然,指针类型的类数据成员也是如此。然而,特别是在执行层面,这一一般规则是否涵盖所有情况 假设您有一个包含3个成员变量的类,所有变量都是指针类型。如果没有任何成员函数返回指向其中一个变量(如getter函数)的指针,则应将成员变量声明为std::unique\u

我知道
std::unique\u ptr
std::shared\u ptr
背后的一般理念。如果没有其他指针变量要求访问唯一指针指向的对象/基本数据,则应使用唯一指针。但是,存在一个共享指针,用于对单个资源(如文件)进行共享/并发访问

当然,指针类型的类数据成员也是如此。然而,特别是在执行层面,这一一般规则是否涵盖所有情况

  • 假设您有一个包含3个成员变量的类,所有变量都是指针类型。如果没有任何成员函数返回指向其中一个变量(如getter函数)的指针,则应将成员变量声明为
    std::unique\u ptr
    类型。但是,如果返回这些成员变量中的一个,则可能会出现另一个指针试图绑定到同一资源的情况。在这种情况下,您应该声明该特定成员的类型为
    std::shared\u ptr
这似乎是一条合乎逻辑的规则。我想,我想弄清楚的是,当声明为成员变量时,如何处理智能指针,因为决策更加困难

如果没有其他指针变量要求访问唯一指针指向的对象/基本数据,则应使用唯一指针。但是,存在一个共享指针,用于对单个资源(如文件)进行共享/并发访问

我有不同的理解。唯一ptr和共享ptr之间的区别不在于访问。这是生命周期

unique_ptr不支持复制语义,因此它始终只有一个所有者

因此,我认为对于类成员变量,这取决于您是否希望类实例成为生命周期的唯一所有者

unique_ptr的另一个好处是,在大多数情况下,它的大小与原始ptr相同。因此,它比共享的ptr更小更快

如果没有其他指针变量要求访问唯一指针指向的对象/基本数据,则应使用唯一指针。但是,存在一个共享指针,用于对单个资源(如文件)进行共享/并发访问

我有不同的理解。唯一ptr和共享ptr之间的区别不在于访问。这是生命周期

unique_ptr不支持复制语义,因此它始终只有一个所有者

因此,我认为对于类成员变量,这取决于您是否希望类实例成为生命周期的唯一所有者


unique_ptr的另一个好处是,在大多数情况下,它的大小与原始ptr相同。所以它比共享的要小和快。

IMO,这个问题本身就有点宽泛。首先,您需要决定是否需要智能指针,或者是否可以按值存储。如果您真的需要使用指针,那么主要是所有权问题,而不是访问问题。我想几年前赫伯·萨特(Herb Sutter)或阿瑟·奥德怀尔(Arthur O'Dwyer)就这个话题进行了一次很好的CppCon演讲。@chtz所以它更多的是关于,哪个类负责删除哪个对象,而不是谁需要访问?依我看,这个问题有点宽泛。首先,您需要决定是否需要智能指针,或者是否可以按值存储。如果您真的需要使用指针,那么主要是所有权问题,而不是访问问题。我想几年前Herb Sutter或Arthur O'Dwyer就这个话题进行了一次很好的CppCon演讲。@chtz更多的是关于哪个类负责删除哪个对象,而不是谁需要访问?