我在理解智能指针在C ++ 11中作为类成员的用法时遇到了麻烦。我已经阅读了很多关于智能指针,我想我不知道如何unique_ptr
和shared_ptr
/ weak_ptr
做工一般。我不明白的是真正的用法。似乎每个人都建议将其unique_ptr
作为几乎所有时间都使用的方式。但是我将如何实现这样的事情:
class Device {
};
class Settings {
Device *device;
public:
Settings(Device *device) {
this->device = device;
}
Device *getDevice() {
return device;
}
};
int main() {
Device *device = new Device();
Settings settings(device);
// ...
Device *myDevice = settings.getDevice();
// do something with myDevice...
}
假设我想用智能指针替换指针。unique_ptr
因为A 而无法使用getDevice()
,对吧?那是我使用shared_ptr
and的时候了weak_ptr
?没有办法使用unique_ptr
?在我看来,大多数情况下shared_ptr
更有意义,除非我在很小的范围内使用了指针?
class Device {
};
class Settings {
std::shared_ptr<Device> device;
public:
Settings(std::shared_ptr<Device> device) {
this->device = device;
}
std::weak_ptr<Device> getDevice() {
return device;
}
};
int main() {
std::shared_ptr<Device> device(new Device());
Settings settings(device);
// ...
std::weak_ptr<Device> myDevice = settings.getDevice();
// do something with myDevice...
}
那是路要走吗?非常感谢!
shared_ptr
在8/10的情况下a 是正确的。其他2/10在unique_ptr
和之间分割weak_ptr
。另外,weak_ptr
通常用于中断循环引用;我不确定您的用法是否正确。
device
数据成员拥有什么所有权?您首先必须决定。
unique_ptr
代替,并在调用构造函数时放弃所有权,如果我知道现在不再需要它的话。但是作为Settings
该类的设计师,我不知道调用方是否也想保留引用。也许该设备将在许多地方使用。好吧,也许这正是您的意思。在那种情况下,我不会是唯一的所有者,我猜那是我将使用shared_ptr的时候。而且:如此聪明的点确实可以代替指针,而不是引用,对吗?
device
给的构造函数后settings
,您是否仍然希望能够在调用范围内或仅通过settings
?如果是后者,unique_ptr
则很有用。另外,您是否有返回值为的getDevice()
情况null
。如果没有,请返回参考。