草庐IT

Pointers

全部标签

c++ - 智能指针与引用

我打赌之前可能有人问过这个问题,但由于引用(例如int&name)被搜索者视为引用计数,所以找不到任何东西。为什么从来没有提到引用可以替代智能指针?它只是针对null情况,还是有其他情况?使用这两者有什么优点/缺点? 最佳答案 我认为您混淆了术语。引用和术语引用计数并不是真正在谈论同一件事。引用和智能指针,甚至与此相关的指针非常不同,不可互换。无法重新设置引用。这意味着一旦你有了一个引用,它就只能引用它最初引用的东西。引用只是一个内存地址。另一方面,指针指向内存地址;它可以更改为指向不同的内存地址。当有人说智能指针进行引用计数时,他

c++ - 如何释放指针 vector 中的元素?

所以我有一个这样的指针vector:vectorve;我用这样的指针填充这个vectorExample*e=newExample();ve.push_back(e)但是当我想删除它们时,我如何确保它们被释放?够了吗?ve.erase(ve.begin()+1)deleteve[1] 最佳答案 当然,你必须反过来做:deleteve[1];ve.erase(ve.begin()+1);但是,在表达所有权时,使用智能指针(例如std::unique_ptr)比使用原始指针要好得多。 关于c+

c++ - 指针是否可以指向 const 空类或非 const 类?

应该不是。这是我的用例:我有两个类A和B。classA{B*b_;};classB{public:B():b_string_(""){};private:std::stringb_string_;};我希望b_始终指向B对象。我希望b_指向一个“空”B对象而不是nullptr,这样我就可以始终以定义的方式取消引用*b_以获得空的b_->b_string。所以我想我会创建一个全局“空B对象”:constBnull_b。但我不能(自然地)使用这个Actor:A():b_(&null_b){};因为b_不能指向常量变量。如果不是“空B对象”,b_需要指向可变B对象。使全局非const解决了问

c++ - 在现代 C++ 中使用非智能指针

简短版本:在现代C++中使用非智能指针有什么可以接受的理由吗?长版:我们有一个包含大量旧C++代码的庞大产品,现在我们正试图将其重构为现代C++时代。除了所有老式代码外,还有大量指针在传递(大多数带有SAL注释以提供某种安全感),我想知道我们是否应该将它们全部更改为智能指针,或者保留其中一些?在尝试转换其中一些代码时,我最终得到了一个可以过度使用智能指针的代码。所以问题是:是否存在过度使用智能指针这样的事情?或者换句话说:现在是否有非智能指针可以接受的场景? 最佳答案 智能指针(unique_ptr和shared_ptr)应该是OW

c++ - 带有指针和比较器C++的优先级队列

我刚刚开始学习C++,一半的时间我不知道我在做什么,花了数小时在Google上搜索,然后盲目地将代码放入我的项目中,这可能是一个基本问题,但是我似乎无法使它正确。,这是我的作业的要求,我需要具备以下条件:Edge类中的:public:booloperator()(Edge*,Edge*)Graph类中的:private:priority_queue,Edge>edges我在声明priority_queue时遇到问题。详细信息:如果直接使用它们,则边缘类将给我一个错误“必须具有类的参数”,我知道我无法将两个指针重载到bool运算符中,所以这就是我尝试过的方法:Edge.cpp中的:#in

c++ - 某些 GL 函数的好奇 "void*"参数

对于OpenGL中的某些函数,必须为步长指定一个字节偏移量,例如在glVertexAttribPointer()中。起初我会猜测它会是一个像整数一样的普通数值。但经过检查,我意识到它需要转换为void*(更具体地说是GLvoid*)。我的问题是:void*的预期含义是什么,为什么必须将它用于字节偏移量? 最佳答案 glVertexAttribPointer()是VertexBufferObjects之前的一个旧函数。在VBO之前,您的顶点数据将存储在客户端数组中,您需要在绘制之前将指向数据的指针传递给OpenGL。当VBO出现时,他

C++制作指向const对象的指针数组

我正在尝试创建一个指向常量对象的非常量指针的非常量数组。我的想法是我应该能够更改数组中的指针指向的内容,但它们指向的是常量对象。我在定义这个数组时遇到了问题(它是指向Person类型对象的指针数组-一个自定义类)。我目前正在这样声明数组:Person*people[10];此外,这并没有明确指出指针指向constPersons。所以当我做这样的事情时:people[i]=&p;其中p是对constPerson类型对象的引用,它失败了。 最佳答案 当有疑问时...使用typedef(因为它是显式的,添加了更多专门的语义并完全避免了混淆

c++ - 使用指针翻转数组

#includeusingnamespacestd;int*flipArray(intinput[],intn){intoutput[n];intpos=0;for(inti=n-1;i>=0;i--){output[pos++]=input[i];}int*p=output;for(intk=0;k我正在尝试使用返回指针的函数翻转firstArray,但我很难理解如何使用指针访问索引。这就是我困惑的原因:在函数flipArray中,以下for循环:for(intk=0;k向控制台打印“54321”。据我了解,我应该使用*(p+k)而不是*(p-k)来访问vector的元素。如果我打印

C++ 从函数返回双指针....怎么了?

我似乎无法弄清楚我的函数有什么问题....我需要向用户询问价格,然后将其作为双指针返回,但我遇到了无数错误:double*getPrice(){double*price;cout>&price;returnprice;} 最佳答案 为了使用任何类型的指针,它需要指向有效内存。现在你有一个未初始化并指向垃圾的指针。尝试以下操作double*price=newdouble();此外,您需要将cin传递给double而不是double**。cin>>*price;请注意,这将在您的进程中分配新内存,稍后必须释放这些内存。即由getPric

c++ - 为什么要对地址运算符和引用声明符共享与符号 (&)?

按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。在C++中,&字符(&)可用于获取左值的地址、函数指示符或限定名称。.inty;int*p_to_y=&y;该字符在C++中作为引用声明符共享使用。.inty;int&y_alias=y;在粗略了解C之后学习C++时,这种双重用法让我很困惑!我知道使用符号的上下文会造成所有差异,但鉴于引用和指针是不应混淆的重要概念,任何人都可以提出为什么&被回收而不是使