问题标签 [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.

0 投票
1 回答
244 浏览

c++ - 在决定游戏中对象的生命时,何时使用指针、引用、原始指针和智能指针?

我目前正在尝试了解何时使用实际对象、原始指针和智能指针。在以下示例中,哪个最好使用或每个步骤?假设我创建并加载了一个图像文件,我想为许多对象重用它,但我不想每次创建对象时都使用图像加载库从路径中加载它。因此加载了单个图像并且多个对象可以引用它。在程序结束之前,图像也应该在没有任何引用的情况下可用。对象本身要么永远存在,要么如果它的粒子对象例如在其生命为 0 后被删除,而不删除图像。谢谢。

0 投票
1 回答
140 浏览

pointers - 为什么使用不安全代码的二叉树在调试模式下有错误的内存访问,但没有释放?

我正在尝试在不安全的 Rust 中实现二叉树,它似乎是调试和发布之间的区别。

在调试时执行的这段代码很可能访问错误的内存地址,但如果在发布模式下编译它似乎没问题。

我完全有可能犯了一个错误,因为我对原始指针很陌生,但是有不同的输出真的很奇怪。

我的不同输出真的是错误内存访问的标志吗?使用不安全的 Rust 时,这是预期的吗?这是代码气味的标志吗?

在调试模式下,我机器上的输出是:

在发布模式下,我机器上的输出是:

这里的代码,尽可能地减少。

我在 Ubuntu 18.04 上使用 Rust 1.32.0 在 Oracle VM 上运行了它。

0 投票
2 回答
90 浏览

c++ - 进入智能指针,如何处理表示所有权?

我已经制作了一个动态图结构,其中节点和弧都是类(我的意思是弧是内存中的实际实例,它们不是由节点到节点的邻接列表暗示的)。每个节点都有一个指向它所连接的弧的指针列表。每条弧都有 2 个指向它所连接的 2 个节点的指针。

删除一个节点调用它的每个弧的删除。每个弧删除从它连接的 2 个节点的弧列表中删除其指针。简化:

如果我想在这里开始使用智能指针,我该如何进行?每个弧是否拥有 2 个节点,或者 2 个节点是否共享单个弧的所有权?我在考虑一个 shared_ptr,但共享指针只会在删除两个节点时删除弧。如果我只删除一个节点,如果我使用 shared_ptr,我仍然必须明确删除它的所有弧。这完全违背了首先不使用原始指针的观点。

节点可以单独存在;每条弧由两个节点拥有,并且只有这两个节点存在,它才能存在。

我应该使用其他类型的智能指针来处理这个问题吗?还是原始指针只是简单的方法?

0 投票
1 回答
422 浏览

pointers - 为什么使用原始指针的链表中的节点会损坏?

在实现链表时,我正在努力学习原始指针。一段简单的代码给了我意想不到的结果,我很难找到任何解释:

操场

这段代码给了我以下输出:

对于前 2 个元素,代码的行为符合预期:它创建了一个元素,其下一个元素为空指针。这是添加第二个元素后的状态:

当添加第三个元素时,事情变得很奇怪,链表变成了这样的东西:

似乎链表元素的next字段开始指向元素本身。

我已经调试了该LinkedListElement::new方法,发现应该从中返回正确的元素:

由于某种原因,在它返回到LinkedList::insert方法之后,甚至在self.head重新分配之前,它的内容都会LinkedList self“损坏”。

我知道在 Rust 中使用原始指针并不习惯,但我仍然想学习它们。

0 投票
1 回答
202 浏览

opengl - 在绘制到屏幕之前,opengl 纹理中的意外像素发生了变化

我正在编写一个能够在屏幕上绘制像素的框架。但是现在我正在尝试更新屏幕,前 4 个像素显示随机颜色。

当我只是将一个指向图像数据的指针发送到我的窗口模块时,我没有遇到这个问题,但是现在我将一个绘图函数作为闭包传递,这开始发生了。我不认为这是我的绘图功能中的问题,因为我写了这些像素并且它们仍然被修改。

我的主要绘图功能:

我的窗口绘图例程:

可以找到完整的项目: https ://github.com/Pandabear314/sam_graphics

我期待一个黑屏,每帧在屏幕上随机绘制一个白色像素。然而,左下角包括 4 个随机像素。第一个和第三个像素发生变化,而第二个和第四个像素不变。

显示结果的图像:http: //prntscr.com/nwl2gk

0 投票
3 回答
444 浏览

c++ - 具有多个原始指针的 C++ 构造函数

我不知道如何为具有多个原始指针的对象创建构造函数。我了解如何制作一个,但不了解多个。

我试图在初始化期间编写一个新的构造函数,然后指定从供体对象访问的内容。

我想知道一种方法来制作多个构造函数,这些构造函数根据初始化的顺序从一个对象中提取不同的 l 值,但是,我找不到有关如何执行此操作的信息。我在下面有一些例子。

我无法理解,我知道我遗漏了一些东西,因为这个问题必须是可以解决的。无论您身在何处,请帮助我掌握 c++。

0 投票
1 回答
756 浏览

string - Rust 创建带有指针偏移的字符串

所以假设我有一个String,"Foo Bar"并且我想创建一个子字符串"Bar"而不分配新内存。

所以我将原始字符串的原始指针移动到子字符串的开头(在这种情况下将其偏移 4)并使用 String::from_raw_parts() 函数来创建字符串。

到目前为止,我有以下代码,据我所知,它应该可以做到这一点。我只是不明白为什么这不起作用。

我在 Windows 上收到以下错误:

这些在 Linux 上(cargo run;cargo run --release):

我认为它与String的析构函数有关,因为只要txt在范围内,程序就可以正常运行。

需要注意的另一件事是,当我使用ptr.add(0)而不是ptr.add(4)它运行时没有错误。

另一方面,创建切片并没有给我带来任何问题。丢弃效果很好。

String最后,我想在不分配新内存的情况下将拥有的 String 拆分为多个拥有的 s。

任何帮助表示赞赏。

0 投票
2 回答
1408 浏览

c++ - 如何防止删除用作共享指针的原始指针?

我为一个 C++ 类实现了一个 C-API,它使用其他对象的共享指针来访问它们。在我的 C-API 中,我当然只能得到原始指针。因此,我将 C-API 中的原始指针“转换”为共享指针,然后将其与我的 C++ 类方法一起使用:

现在我有一个问题,在“方法”的末尾总是调用共享指针析构函数,不幸的是它杀死了我的原始指针指向的对象(我不想要)。那么,如何防止原始指针被杀死?

我已经尝试过 reset() 或 swap() 之类的共享指针函数,但它们都没有让我的原始指针消失......

预期的结果是原始指针 e 在此函数返回后仍指向有效对象。实际上,原始指针指向一个已删除的对象。

0 投票
1 回答
54 浏览

c++ - 更改保持原始指针指向其字段的对象的地址

我想重新分配一个具有自引用的类,名为CarJoker.
这里的“重新分配”意味着 = 更改对象的地址。

CarJoker这种技术对于在可调整大小的连续数组(例如池)中制作每个生命实例是必要的。

我考虑使用std::move,但它不能CarJoker::wheels以我希望的方式移动。
( MCVE )

std::move,car2.wheels[0]表示&car1.wa不是&car2.wa如我所愿。
我知道原因,但这不是我的目标,我不知道解决它的优雅方法。

我可怜的解决方法

这是一种不优雅的方式(MCVE):-

缺点:-
1. 很脏。
2. 我必须reIni()为每个在池中存在此类症状的类创建一个特殊名称函数 ( )。我的池也必须识别该功能(例如,使用模板或虚拟功能注册)。

我可怜的解决方法2

我会工作,但我觉得这样的解决方法很疯狂。
该限制增加了编码人员的陷阱。

如果wheels碰巧需要缓存计算昂贵的结果,现在getWheels()经常调用会很昂贵。

0 投票
0 回答
160 浏览

rust - 在 Rust 中初始化 DST 的大小成员(在堆上)

我正在尝试实现一个块列表,也就是一个链表,其中每个节点包含多个元素,一个链表和一个Vec.

执行此操作的直观方法是:

这里的问题是,要从对节点的引用访问向量的元素,需要 2 个解引用操作:第一个解引用实际节点,第二个解引用向量的堆存储切片。

我的解决方案是定义Node<T>为 DST,其最后一个字段是切片:

这使得初始化结构很有趣,因为它不能在堆栈上实例化。

我已经尝试了两种实验box语法,std::alloc::alloc但都没有成功。

我的问题如下:忽略所有好的做法,

  1. 这实际上是否比Vec版本更有效,如果没有,那么为什么,我是否误算了取消引用或者编译器是否优化了它们?

  2. 有没有办法直接在堆上分配这样的 DST,并将切片分配为特定大小。更具体地说(如果这是要走的路),比如说Node在切片之前有多个大小的成员,如果编译器可能已经进行了一些重新排序,我怎么能ptr.write(...)其中任何一个(以避免丢弃未初始化的位)?

我相信第二个问题与讨论有关,offset_of!但我不确定。