weak_intrusive_pointer
全部标签 这个问题在这里已经有了答案:Isnullreferencepossible?(4个回答)关闭3年前。我想知道C++标准对这样的代码有何规定:int*ptr=NULL;int&ref=*ptr;int*ptr2=&ref;实际上,结果是ptr2为NULL,但我想知道,这只是一个实现细节还是标准中已明确定义?在不同的情况下,对NULL指针的取消引用应该会导致崩溃,但在这里我取消引用它是为了获得一个由编译器作为指针实现的引用,因此实际上并没有对NULL进行实际的取消引用。 最佳答案 取消引用NULL指针是未定义的行为。事实上,标准在注释(
将指向非常量的指针转换为指向常数的指针是合法的。那么为什么将指向非const的指针转换为指向const的指针是不合法的呢?例如,为什么下面的代码是非法的:char*s1=0;constchar*s2=s1;//OK...char*a[MAX];//akachar**constchar**ps=a;//error! 最佳答案 来自标准:constcharc='c';char*pc;constchar**pcc=&pc;//notallowed*pcc=&c;*pc='C';//wouldallowtomodifyaconstobjec
如果我理解正确,weak_ptr不会增加托管对象的引用计数,因此它不代表所有权。它只是让您访问一个对象,该对象的生命周期由其他人管理。所以我真的不明白为什么不能从unique_ptr构造weak_ptr,而只能从shared_ptr构造。有人能简单解释一下吗? 最佳答案 如果您考虑一下,weak_ptr必须引用对象本身以外的其他内容。这是因为对象可以不复存在(当没有更多的强指针指向它时)并且weak_ptr仍然必须引用包含对象不再存在的信息的东西。使用shared_ptr,该东西就是包含引用计数的东西。但是对于unique_ptr,
在C++11中,您可以使用shared_ptr建立与对象或变量的所有权关系和weak_ptr以非拥有的方式安全地引用该对象。您也可以使用unique_ptr建立与对象或变量的所有权关系。但是,如果其他非拥有对象也想引用该对象怎么办?weak_ptr在这种情况下没有帮助。原始指针很有帮助,但也带来了各种缺点(例如,它们可以是automaticallyinitializedtonullptr,但这是通过与std::*_ptr类型不一致的技术来实现的)。weak_ptr的等价物是什么?对于通过unique_ptr拥有的对象的非拥有引用?这是一个清晰的示例,类似于我正在开发的游戏中的某些内容。
我使用了一个将enum*转换为int*的代码。像这样的:enumfoo{...}...foofoobar;int*pi=reinterpret_cast(&foobar);编译代码(g++4.1.2)时,我收到以下警告消息:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules我用谷歌搜索了这条消息,发现只有在严格的别名优化开启时才会发生这种情况。我有以下问题:如果我留下带有此警告的代码,它会生成潜在的错误代码吗?有没有办法解决这个问题?如果没有,是否可以从源文件内部关闭严格别名(因为我不想为所有源文件关闭它,也不想为这
我了解如何使用weak_ptr和shared_ptr。通过计算对象中的引用数,我了解shared_ptr的工作原理。weak_ptr是如何工作的?我尝试通读boost源代码,但我对boost不够熟悉,无法理解它使用的所有东西。谢谢。 最佳答案 shared_ptr使用额外的“计数器”对象(又名“共享计数”或“控制block”)来存储引用计数。(顺便说一句:那个“计数器”对象也存储了删除器。)每个shared_ptr和weak_ptr都包含一个指向实际指针对象的指针,以及一个指向“计数器”对象的第二个指针。为了实现weak_ptr,“
你有一个带有参数的函数,一个指向类型的指针。typebarstruct{...}funcfoo(arg*bar)两者有什么区别:varbbarfoo(&b)和b:=new(bar)foo(b)使用new创建分配。 最佳答案 不,没有区别,因为与C相反,Go明确声明您可以提供指向本地创建的变量的指针。来自thedocumentation:Notethat,unlikeinC,it'sperfectlyOKtoreturntheaddressofalocalvariable;thestorageassociatedwiththevari
我正在学习Go,但对于何时使用指针有点困惑。具体来说,从函数返回struct时,什么时候返回struct实例本身合适,什么时候返回指向该结构的指针合适?示例代码:typeCarstruct{makestringmodelstring}funcWhatever(){varcarCarcar:=Car{"honda","civic"}//...returncar}在哪些情况下我想要返回指针,而我不想想要返回指针?有没有好的经验法则? 最佳答案 您需要牢记两点,性能和API。如何使用汽车?它是一个有状态的对象吗?它是一个大结构吗?不幸的是
在Go编程语言中;指向指针的指针如何变得有用?(如果它们不是真的有用,为什么它们不是非法的?) 最佳答案 任何数据类型的有用性取决于正在解决的问题以及用于解决问题的方法。如果一个数据类型不适合问题,它根本不适合问题-没有别的了。Go编程语言(以及大多数其他编程语言)基于程序员可以用来构建新数据类型的简单规则。其中一些规则是:*T:创建一个新的数据类型,它是一个指向T的指针[10]T:Ts数组struct{tT;uU...}:一个包含T作为组件的结构...程序员可以通过组合这些简单的规则来创建复杂的数据类型。可能的数据类型的总数超过了
我们编写了一个程序,通过它我们试图找到一个常量的地址。可以这样吗?packagemainfuncmain(){constk=5address:=&k}它给出了一个错误,谁能告诉我们如何找到一个常量的地址? 最佳答案 简而言之:你不能。错误信息说:cannottaketheaddressofk地址运算符&的操作数有限制。Spec:Addressoperators:ForanoperandxoftypeT,theaddressoperation&xgeneratesapointeroftype*Ttox.Theoperandmustbe