Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用裸指针而不是弱指针有什么好处吗?_C++_Pointers_C++11_Smart Pointers - Fatal编程技术网

C++ 使用裸指针而不是弱指针有什么好处吗?

C++ 使用裸指针而不是弱指针有什么好处吗?,c++,pointers,c++11,smart-pointers,C++,Pointers,C++11,Smart Pointers,问题:是否有任何令人信服的理由对非自有资源使用裸指针,或者我们应该使用弱\u ptr 州 std::weak_ptr为临时所有权建模:仅当对象存在时才需要访问该对象,并且其他人可能随时删除该对象 但是,在被接受的答案中,我们有这样的陈述: 当知道资源将超过引用对象/范围时,对资源的非所有权引用使用哑指针(原始指针)或引用。当您需要可空性或可重置性时,更喜欢引用并使用原始指针。。。。如果您想要对资源的非所有权引用,但不知道该资源是否比引用它的对象寿命长,请将该资源打包在共享的\u ptr中,并使用

问题:是否有任何令人信服的理由对非自有资源使用裸指针,或者我们应该使用
弱\u ptr

std::weak_ptr
为临时所有权建模:仅当对象存在时才需要访问该对象,并且其他人可能随时删除该对象

但是,在被接受的答案中,我们有这样的陈述:

当知道资源将超过引用对象/范围时,对资源的非所有权引用使用哑指针(原始指针)或引用。当您需要可空性或可重置性时,更喜欢引用并使用原始指针。。。。如果您想要对资源的非所有权引用,但不知道该资源是否比引用它的对象寿命长,请将该资源打包在
共享的\u ptr
中,并使用
弱的\u ptr


这个答案之后是大量关于裸指针使用的来回讨论,没有真正的解决方案。我看不出有什么理由使用愚蠢的指针。我遗漏了什么吗?

一个
弱的ptr
有一个非常特殊的目的:打破
共享的ptr
循环。例如,
std::enable_shared_from_此
基于让对象自身包含一个
弱ptr
。如果它直接包含一个
共享的\u ptr
,那么这将创建一个循环,因此它有一个
弱的\u ptr

您使用
弱\u ptr
,否则您将拥有
共享的\u ptr
弱_ptr
的成本较高,因为除了
共享_ptr
的成本外,还存在对象存在性检查,该检查生成或不生成
共享_ptr
。此外,它是一个更复杂的野兽,因此更容易使用错误

我想不出
弱\u ptr
与“临时所有权”有任何关系(除了检查存在性并使用生成的
共享\u ptr
后,这是一个临时共享所有权,每次使用都会重复)。例如,
std::enable_shared_from_this
与临时所有权无关。通常我会忽略这样一个说法的来源,并建议别人忽略它,但是CPPraseC.E.com是我们在免费在线C++引用中所拥有的最好的方法。奇怪的是,它包含了一个无稽之谈。但是,没有什么是完美的,正如我曾经在clc++中对比亚恩说的那样,于是他纠正了我对“完美”的说法。陛下嗯


我不知道使用原始指针而不是
弱\u ptr
有什么好处,因为需要
弱\u ptr
。原始指针不能像
弱ptr
那样保持
共享ptr
的控制块,因此在我看来,仅仅用原始指针替换
弱ptr
的想法是毫无意义的。但是,有一天,当一个人不再对自己从未想到的事情感到惊讶的时候,他就死了,因此,可能有一些对我来说不太清楚的用法



此外,如果需要原始指针,则使用
弱\u ptr
也没有任何优势。相反,
弱ptr
引入了相对来说巨大的控制块分配和引用计数成本。因此,我想不出在任何情况下,用
弱\u ptr
替换原始指针是有意义的,我也不希望在这种情况下,我会学到其他方法。

弱指针实际上没有什么用处。弱指针只有在需要它的锁函数时才有用(将指针转换为共享指针,以防止在对其进行操作时进行垃圾收集)。如果您只使用原始指针,则最好使用非拥有指针,因为共享指针和弱指针都有开销。

共享指针和弱指针的成本很高。除非您有实际的用例需要它们,否则不要使用它们。
weak\u ptr
必须引用由共享指针“管理”的对象。一个愚蠢的指针不一定非得这么做。它可以指向任何东西。在纯C++中,一般不需要原始指针,除非您是真正不能接受小性能影响的0.1%个之一。这完全是主观的,但大多数人属于“始终使用智能指针”阵营;为了解释前后关系,值得考虑的原始指针的第一种替代方法通常是std::unique_ptr,而不是弱指针。只有当托管对象的生存期比单个函数内作用域或对象生存期更复杂时,您才需要购买共享指针和弱指针。未来可能会解决上述大多数问题。在对指针所指的对象进行操作时,您什么时候不想阻止垃圾收集?@RoryJaffe大多数时候。您应该设计您的应用程序,使资源的所有权和生命周期清晰且定义良好。在这样的系统中,指针需要检查它是否仍然有效的情况应该相对较少。@RoryJaffe大多数时候,当你向下传递指针到函数时,你有一个拥有的指针,就像调用端的共享指针一样,它已经阻止了对象在被调用方上下文中被删除。很抱歉告诉你,如果你想要一个不属于你的指针,你应该使用原始指针,除非你需要一个弱的ptr,因为这会增加额外的开销。@Arne:我同意。不必道歉。;-)根据我看到的C++会议视频,对于所有拥有指针的UnQuyGPTR,对于所有非拥有指针,只有在共享所有权的情况下,SyrdY-PTR才是真正的指针,例如:在两个线程之间共享一个对象,如果您明确允许对象在每个访问之间死亡,那么ViguxPTR将是唯一的。向所有东西抛出共享指针被认为是糟糕的编码风格。讨论了
观察者\u ptr
和ass