问题标签 [raw-pointer]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++11 - C++11 移动赋值和复制赋值(运算符)——删除的使用
我目前的理解是C++11 移动和复制赋值运算符都应该调用 delete 以防止内存泄漏,但 C++11 移动和复制构造函数不应该。
如果我的理解是正确的,构造函数不需要调用delete
,但是我不确定为什么。考虑以下示例:
查看此维基百科文章中的示例代码,我很清楚:
Move Constructor 不会因为资源被转移而泄漏。任何由未到期的类指向的已分配数据都将转移到即将到期的类,并由即将到期的类的析构函数删除。
但是,我对 Copy Constructor 是否泄漏感到困惑。
移动赋值运算符可能不会泄漏,因为它只是交换指针。
我再次对复制分配运算符感到困惑。我不确定为什么需要使用临时对象?我的猜测是在此函数结束时超出范围时所拥有的资源并被销毁
tmp
?other
(除了tmp
它的资源与类中的指针交换了this
吗?)
为方便起见,下面提供了代码:
我想这暗示了为什么设置(未初始化/未分配)悬空指针很重要nullptr
,因为这将防止在删除析构函数时出现内存错误?
我认为这是因为资源通过移动构造函数传输的情况,但是过期对象接收到一个从未分配过的悬空指针——我们不希望随后调用析构函数和delete
指针——除非我们确保它指向nullptr
(无操作)。
谁能澄清我提出的一些观点?
c++ - C++ 减少使用原始或其他指针和/或返回可为空的非指针
我正在使用 OpenGL 用 C++ 编写游戏,并决定编写一个基于组件的系统,就像 Unity 或 Unreal Engine 一样——为了好玩并了解这些系统是如何制作/工作的。我已经到了需要实现组件和游戏对象的地步,我已经非常成功地完成了。
我的实现工作......它只是不完全是我想要的。目前,我将组件存储为组件指针的私有向量,并在请求时返回组件。
例子:
组件是抽象类,并由诸如 MeshRenderer 之类的组件扩展。
上图:我的 AddComponent(); 代码,用于添加组件 - 需要一个指向组件的指针...
上图:我如何将组件存储在 GameObject 类中,允许我通过索引循环访问它们
我对这种方法的问题是由于我如何实现我的 GetComponent() 函数。它返回一个指向组件的指针,如果不存在这样的组件,则可能返回一个 nullptr。
我的问题是,由于返回一个指针,我可以调用 delete 并删除指针。这些是原始指针,但我确保它们在 GameObject 被销毁时由程序处理,所以 - 希望(除非我无能)不要担心内存泄漏 - 但我更愿意返回一个引用,因为您不能对它们调用“删除”这一事实 - 以避免我可能犯的任何愚蠢错误。
我已将变量设为私有,并且 GameObject 处理组件的删除,我不希望自己因无能等原因而能够删除某些内容。
我曾考虑过返回一个 unique_ptr,但我不确定该实现是否更可取。
(作为额外说明,我确实需要 GetComponent() 函数来返回某种 null 或指示不存在此类组件)
rust - 是否有更清晰的方式来表示取消引用原始指针并在 Rust 中应用它们的函数?
我正在使用 Rust 中的原始指针,并且有几行非常难以阅读,因为我在 Rust 中找不到与->
C++ 中具有类似功能的运算符。一个存在吗?
这是我目前难以阅读的代码片段:
rust - 将结构复制到 Rust 中的特定内存位置
如果我有一个struct
,例如:
如何将它复制到内存中的特定位置,例如0x1000
有效地复制到内存中的某个点?像这样的东西会起作用吗?
请注意,repr(C, packed)
这里实际上需要该部分。
该软件在裸 x86_64, ring 0上运行,没有操作系统或其他限制。另外,我在没有标准库的情况下进行编程,所以这应该可以只使用core
库来实现。
这当然是不安全的,但这不是问题。
编辑:只是澄清一下:我正在复制到未初始化的内存。
c++ - 指向 std::unique_ptr 的内容
我有一个std::unique_ptr
和另一个原始指针。我希望原始指针指向unique_ptr
没有任何所有权的内容。它是只读关系:
这很糟糕吗?有没有其他选择?
注意:真实的例子更复杂。他们不在同一个班级。
c++ - 如何使用原始指针将对象分配给向量中对象的属性?
这个问题可能是一个菜鸟问题,因为我刚刚开始使用 C++。但我无法找出我做错了什么。我正在做的项目是学校的作业。在这个赋值中,我们只允许使用原始指针,所以我们找出原始指针是如何工作的。
现在那些原始指针给了我一些麻烦。这些指针给了我错误:'不存在从“房间”到“房间 *”的合适转换函数'。
为了尝试解释我是如何导致此错误的,我将尝试提供我编写的代码的精简版本。
我有一个名为 Level 的类,这是一个在向量中包含一个向量的类,以便能够整齐地打印出彼此相邻的房间。不是每个房间都是连接的,所以我给了房间的方向属性,用于与其他房间的连接。但是当我尝试通过设置 _rooms[y][x].South 和 _rooms[y+1][x] 来生成房间之间的连接时。我收到错误消息:'不存在从“房间”到“房间 *”的合适转换函数'。
有人可以澄清为什么我会收到此错误消息吗?所有帮助将不胜感激。
c++ - 有效地传递对象?
对于我的大多数程序,我一直通过引用传递对象:
对于我不需要编辑的对象(只需调用它的函数),通过引用传递是最节省内存的解决方案吗?
或者,或者使用原始指针?
c++ - 通过引用混淆?
考虑这个例子:
我是否说这两种方法都通过引用传递变量(即不创建副本),唯一的区别是 MyOtherFunction 正在接收指针?
c++ - C++/pimpl:原始指针还是 unique_ptr?什么是更好的选择?
根据下表,当您将 aunique_ptr<T>
用于前向声明的类型T
时,unique_ptr
析构函数需要T
是完整的,但移动赋值运算符(和reset
)也需要:
https://stackoverflow.com/a/6089065/1794803
因此,对于您的pImpl
习惯用法,要正确实现它,您必须声明delete
and move assignment method
(作为副作用,将它们标记为非内联):
但是,既然std::unique_ptr
是动态内存的 RAII 解决方案,并且您pImpl
已经在一个类中,并且无论如何您都被迫编写一个析构函数,那么只管理一个原始指针不是更好吗,因为您的类已经是一个 RAII-就像从?的角度来看p_impl
:
这不是更好的解决方案吗?(+ 定义或删除您自己的复制/移动运算符,如果您想分类是否可复制/可移动;但这是一个“有意识的选择”;但是,不写移动分配unique_ptr
是错误的)。
使用 a unique_ptr
only 可以节省您在析构函数中编写 a delete p_impl
,无论如何您都必须声明。
unique_ptr
对于即使在异常情况下也会被破坏的局部动态对象是一个很好的选择,但是对于“属性”,如果你不记得你必须重写移动赋值运算符,你除了获得 UB 的可能性之外什么也没有保存。
c++ - 如何从唯一指针递归使用原始指针?
我正在尝试创建具有唯一指针的 AVL 树。但是我被困在递归插入节点的基本部分。insertNode_
此代码在调用函数时创建分段错误。我认为仅传递原始指针会起作用,但事实并非如此。