问题标签 [dangling-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.
debugging - 悬空指针 - 找出创建对象的时间
我正在使用 windbg 调试软件 Use-After-Free 错误(无权访问源代码)。
在哪里
使用 windbg 和“PageHeap”,我可以轻松找出该对象何时被释放(!heap -p -a 0xXXXXXXX)和重用。
我的问题是,有什么方法可以找出该对象何时被创建。
谢谢
c++ - C++ 中的悬空指针和删除命令
我注意到我的 C++ 代码中有一些非常奇怪的东西。
我认为这delete
会从堆中删除内存并且b->doIt()
会失败。但是在运行这段代码时它可以工作,甚至打印“hello”。
为什么?
c++ - 悬空指针仍在访问内存值
我对这个概念很陌生,我很困惑,如果悬空指针是一个指向内存位置的指针,该内存位置指向已释放或删除的内存,那么在这种情况下为什么它仍然能够调用该函数test()
任何帮助,将不胜感激。
rust - Rust 中的移动语义
我在 Rust 中包装了一个 C 库,它的许多函数通过指向结构的指针获取参数,这些结构本身通常具有指向其他结构的指针。为了减少开销,我想提供将 Rust 数据编组到 C 结构中的结果缓存的能力。
以下是 C 库可能期望某些参数的示例:
我想象一个拥有的“缓存”版本会是什么样子:
的p_foo
字段bar
将被构造为指向 内的Some
值foo
,或者如果存在则为空指针None
。
当然,这里的问题是,如果Cached
要移动 的值,则顺子memcpy
将不合适,并且bar.p_foo
还需要重定向。这在 C++ 中很容易确保,它具有可定义的移动语义,但是除了“在使用之前不要设置”之外,Rust 是否提供了解决方案bar.p_foo
?虽然这样做肯定会奏效,但我认为这些缓存值的移动频率不会超过(甚至接近于)它们被重用的频率,而且设置这些缓存值需要做一些工作指针,尤其是在嵌套/链接很深/很长的情况下。我也不想把Box
子结构放在堆上。
为了澄清,这是我可以用 C++ 编写的,我想在 Rust 中复制:
c++ - 悬空指针和分段错误
这是一个示例代码:
ptr 那是一个悬空指针。当我运行该程序时,它会打印:
但它也可能导致分段错误(即使只调用了一个读取内存的函数 - getNumber)。
- 当 ptr 指向的内存位置没有被其他对象(程序)分配时,没有分段错误,对吧?怎么解释?
c++ - 如何在 C++ 中有意保留和收获一个悬空指针
我正在写一个LLVM 插件。在其中,我创建了一个全局指针数组,这些指针沿着程序中不同函数的流程获取数据。当指针在函数范围内获取地址时,可以合理地假设,一旦超出其范围,内存内容就有可能在操作系统认为合适的情况下被覆盖。
我想知道是否有一种方法可以使指针的内容在程序内部的所有范围内都保持不变(除非我发现自己需要更改它) 。
我认为像volatile
这样的标志可以解决问题,但与非易失性指令相比,这一切似乎只是保持其顺序位置。
c++ - 捕捉悬空指针
我编写了以下输出代码45
:
因为生命周期n
在范围内结束,所以我希望这段代码会发出错误或警告。使用 GCC 6.1.0 和 Clang 3.8.0 以及 libubsan sanitizer 我没有得到任何提示。
Valgrind 也没有抱怨。如果我查看程序集,GCC 只是重用堆栈中的相同值:
我知道尊重 NULL 指针是未定义的行为,但是悬空指针呢?(如果是未定义的行为,请提供标准中的引用。)
我希望有人证明这是未定义的行为,而不仅仅是说它没有证据。副本有很多未引用声明的答案。在 C 中,它明确表示“在其生命周期之外使用对象”是未定义的行为。在 C++ 中,情况并非如此。事实上,§3.8 似乎并没有直接说任何话。
请重新打开我的问题,以便我可以获得一些实际证据,而不是货物崇拜。
c++ - 澄清 C/C++ 中的悬空指针
我对 C/C++ 中的悬空指针有点困惑
我假设在函数终止Node* pt
之前仍然是悬空指针?remove()
我不必担心终止Node* pt
后的指针?remove()
python - 使用 numpy/ctypes 公开 C 分配的内存缓冲区的更安全方法?
我正在为使用共享内存缓冲区存储其内部状态的 C 库编写 Python 绑定。这些缓冲区的分配和释放是由库本身在 Python 之外完成的,但我可以通过从 Python 中调用包装的构造函数/析构函数来间接控制何时发生这种情况。我想向 Python 公开一些缓冲区,以便我可以从中读取,并在某些情况下将值推送给它们。性能和内存使用是重要的问题,所以我想尽可能避免复制数据。
我目前的方法是创建一个 numpy 数组,它可以直接查看 ctypes 指针:
除了避免复制之外,这还意味着我可以使用 numpy 的索引和赋值语法并将其直接传递给其他 numpy 函数:
但是,它本身也很危险:
为了使这更安全,我需要能够在尝试读取/写入数组内容之前检查底层 C 指针是否已被释放。我对如何做到这一点有一些想法:
- 一种方法是生成一个包含对属性的
np.ndarray
引用的子类,检查它是否在对其底层内存进行任何读/写之前,如果是这种情况则引发异常。_cbuf
MyWrapper
None
- 我可以轻松地在同一个缓冲区上生成多个视图,例如通过
.view
强制转换或切片,因此每个视图都需要继承对的引用_cbuf
和执行检查的方法。我怀疑这可以通过覆盖来实现__array_finalize__
,但我不确定具体如何。 - 在读取和/或写入数组内容的任何操作之前,还需要调用“指针检查”方法。我对 numpy 的内部结构知之甚少,无法提供详尽的覆盖方法列表。
我如何实现np.ndarray
执行此检查的子类?任何人都可以提出更好的方法吗?
更新:这个类做了我想要的大部分:
例如:
我敢肯定还有其他我错过的边缘情况。
更新 2:正如@ivan_pozdeevweakref.proxy
所建议的,我玩过. 这是一个好主意,但不幸的是我看不出它如何与 numpy 数组一起工作。我可以尝试为返回的 numpy 数组创建一个弱引用:.buffer
我认为这里的问题是np.ndarray
返回的实例wrap.buffer
立即超出范围。一种解决方法是让类在初始化时实例化数组,持有对它的强引用,并让.buffer()
getter 将 a 返回weakref.proxy
到数组:
但是,如果我在仍然分配缓冲区的同时在同一个数组上创建第二个视图,则会中断:
这被严重破坏了 - 在调用之后,wrap2.__del__()
我不仅可以读取和写入buf2
一个 numpy 数组视图wrap2._cbuf
,而且我什至可以读取和写入buf
,这应该是不可能的,因为wrap2.__del__()
设置wrap2._buffer
为None
。
c++ - C ++将抽象类的派生对象添加到另一个没有悬空指针的类中?
我有一个简单的容器类,它指向一个抽象类,并且我有函数来获取/设置容器类中的指针。更具体地说,这个类看起来像这样:
Abstract
是一个抽象类。正如已经看到的那样,存在悬空指针的危险。我知道我可以复制对象(新)然后指向它。但我无法创建抽象类的实例。有什么解决方案?
以下只是更多信息:
类定义
简单的测试