来自多个来源的空检查:shared_ptr vs 双指针?
Null checking from multiple sources: shared_ptr vs double pointer?
需要对来自多个来源的缓存指针进行空检查,如下所示:
双指针:
int *ptr = new int(10);
int **pptr = &ptr; // from another source
ptr = nullptr;
cout << *pptr << endl; //nullptr
shared_ptr:
shared_ptr<int> sptr = make_shared<int>(10);
weak_ptr<int> wptr = sptr; //from another source
sptr.reset();
cout << wptr.lock() << endl; //nullptr
疑虑:
我不是特别喜欢双指针语法,更不用说它可能不安全,但我一直听说 shared_ptr 由于引用计数而非常慢,我并不真正需要它,因为只一个来源应该负责对象范围。对于托管内存,性能损失是否值得?
最好,是否有任何替代方案?
... but I keep hearing that shared_ptr is really slow due to reference counting ...
是的,引用计数会导致性能开销。虽然很小.
... which I don't really need because only one source is supposed to be in charge of object scope.
...
Preferably, are there any alternatives to either of these?
如果正确且异常安全的内存管理是您唯一关心的问题,并且您只有一个 owner,则始终可以使用 std::unique_ptr
和 get()
函数:
unique_ptr<int> uptr = make_unique<int>(10);
uptr.reset();
cout << uptr.get() << endl; //nullptr
在我看来,您的设计或我们称之为的任何东西都在为第二个示例呐喊。而且它更安全。去那个吧。
首先,预优化是万恶之源,你不应该因为害怕轻微的性能损失而放弃编程语言中的一些最好的特性!
既然我们已经解决了这个问题,我会建议您尽可能多地使用托管对象,如果性能成为问题并且当性能成为问题时使用实际的基准测试工具来找到您的瓶颈...
关于你的实际问题,你用你的指针做什么还不够清楚,所以很难提出替代方案,但我建议你看看这个 link 以获得对智能的全面描述标准库中的指针。
需要对来自多个来源的缓存指针进行空检查,如下所示:
双指针:
int *ptr = new int(10);
int **pptr = &ptr; // from another source
ptr = nullptr;
cout << *pptr << endl; //nullptr
shared_ptr:
shared_ptr<int> sptr = make_shared<int>(10);
weak_ptr<int> wptr = sptr; //from another source
sptr.reset();
cout << wptr.lock() << endl; //nullptr
疑虑:
我不是特别喜欢双指针语法,更不用说它可能不安全,但我一直听说 shared_ptr 由于引用计数而非常慢,我并不真正需要它,因为只一个来源应该负责对象范围。对于托管内存,性能损失是否值得?
最好,是否有任何替代方案?
... but I keep hearing that shared_ptr is really slow due to reference counting ...
是的,引用计数会导致性能开销。虽然很小.
... which I don't really need because only one source is supposed to be in charge of object scope.
...
Preferably, are there any alternatives to either of these?
如果正确且异常安全的内存管理是您唯一关心的问题,并且您只有一个 owner,则始终可以使用 std::unique_ptr
和 get()
函数:
unique_ptr<int> uptr = make_unique<int>(10);
uptr.reset();
cout << uptr.get() << endl; //nullptr
在我看来,您的设计或我们称之为的任何东西都在为第二个示例呐喊。而且它更安全。去那个吧。
首先,预优化是万恶之源,你不应该因为害怕轻微的性能损失而放弃编程语言中的一些最好的特性!
既然我们已经解决了这个问题,我会建议您尽可能多地使用托管对象,如果性能成为问题并且当性能成为问题时使用实际的基准测试工具来找到您的瓶颈...
关于你的实际问题,你用你的指针做什么还不够清楚,所以很难提出替代方案,但我建议你看看这个 link 以获得对智能的全面描述标准库中的指针。