问题标签 [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.
c - 为什么以下两个代码提供不同的结果?
第一段代码是:
/li>第二段代码是:
/li>
在上述两个代码中,返回的 char 指针指向一个可能被覆盖的局部变量,但 code-1 仍然成功运行,而 code-2 打印垃圾值。
c++ - 在编译时检测或避免对临时的死引用
以下最小化程序在使用 编译时-O3
可能会出现段错误-O2
,但使用-O0
(使用 clang 4.0)执行良好:
原因是它是使用对从临时构造c.b
的类的临时对象的引用进行初始化的。构造函数退出后,临时对象消失了,但对它的引用仍保留在.B
A
c.C()
B
c.b
鉴于我不控制B
or的实施,我可以采用哪些良好做法来避免这种情况A
?是否有能够检测到这种情况的静态分析仪?(我的版本scan-build
没有发现问题。)
相关:检测对临时的悬空引用
factory - 创建受控类型将在返回时调用 finalize
我想通过以下方式创建一个用于创建和初始化受控类型(有点像工厂)的函数:
由于 finalize 将处理一些在受控类型中指向的对象,因此我最终在 Bar 中出现了悬空指针,并且不知何故这会立即使程序崩溃,因此我从未看到“检查 2”。
这可以通过使用 new Controlled_Type 并在 Create 函数中返回一个指针来轻松解决。但是,我喜欢拥有受控类型而不是指向它的指针的想法,因为当 Bar 超出范围时,将自动调用终结。如果 Bar 是一个指针,我必须手动处理它。
有没有办法正确地做到这一点而不会以悬空指针结束?我应该在调整过程中做一些魔术吗?
pointers - 在 Go 中处理悬空指针
我一直在并行阅读 Rust 和 Go,我发现这两种语言在处理悬空指针及其导致的问题方面存在细微差别。例如,这里是 Rust 的一个版本:
上面会出错,说在函数dangle
中,s
超出范围,我不能返回对它的引用!但是在 Go 中,这似乎是允许的?
在 Go 中如何处理这样的事情?在 Go 中创建悬空指针容易吗?如果是这样,我必须采取什么措施来控制它们?
c++ - 防止在被删除对象上调用函数
我正在尝试解决由于对正在被破坏的对象调用方法而导致我的应用程序崩溃的问题。我有以下课程:
基本上,A 类持有unique_ptr
B 类,它将原始 ptr 存储到 A。B 使用 Timer 的单例实例,它在不同的线程中运行,它安排函数 B::Update() 每 1000 毫秒在该线程上执行一次。有时,当我销毁A
作为成员变量存储在堆栈上的对象时,它A
被销毁了,但是在 class 中有一个指向它的悬空指针B
,这会导致从另一个线程调用的函数B::Update()
使应用程序崩溃,因为 m_pA* 不是nullptr
,所以这会导致未定义的行为。
我应该如何处理,以防止我的应用程序崩溃?将明确设置m_pA = nullptr
;B::~B()
足够了吗?
c - 如果从未使用过,悬空指针是否危险?
我们已经知道 use-after-free 漏洞可能会导致安全问题。由于释放后使用错误是由悬空指针产生的,我的问题是,如果悬空指针没有在程序中使用,它们被认为是安全的还是良性的(不是那么危险)?
c++ - 在 C++ 14 中可靠地确保内存安全
我正在将一些旧的 C++ 代码转换为使用 shared_ptr、unique_ptr 和 weak_ptr,但我一直遇到设计问题。
我有返回新对象的“生成器”方法,以及返回指向现有对象的指针的访问器方法。乍一看,解决方案似乎很简单;为新对象返回 shared_ptr,为访问者返回 weak_ptr。
shared_ptr完全避免了悬空指针,因为如果对象被删除,它的所有共享指针和弱指针都知道它。但是我不断遇到不确定共享指针之间是否存在循环引用的情况。有很多类,其中一些相互指向;有没有可能在某个时候形成一个循环?代码非常复杂,很难分辨——新类是根据脚本文件中的指令创建的。所以我不知道 shared_ptr 是否真的在防止内存泄漏并且一直在手动删除所有对象,这似乎违背了这一点。
我考虑改用unique_ptr,因为我实际上不需要任何地方的共享所有权。(旧的 C++ 代码当然没有任何共享所有权,它只是原始指针。)但是我不能从 unique_ptr 生成weak_ptrs,所以我必须使用原始指针作为弱指针的替身。这解决了内存泄漏问题,但是当 unique_ptr 被销毁时,我可能会留下悬空指针。
所以似乎我可以有一个或另一个:防弹内存泄漏或防弹悬空指针,但不能两者兼而有之。
人们告诉我,我需要将整个程序结构保留在我的脑海中,以便我可以验证没有共享指针循环,但这似乎容易出错。毕竟,我的头只有这么大。有没有办法在只考虑本地代码的情况下实现内存安全?
对我来说,这是面向对象编程的核心原则,而在这种情况下,我似乎失去了它。
c++ - C++ 中的这种未定义行为是否从悬空指针调用函数
当指针悬空时,这里出现了一个问题,询问“为什么这有效”。答案是它是 UB,这意味着它可能有效,也可能无效。
我在一个教程中了解到:
这是否相当于:
我错了吗?即使正如我解释的那样只是调用一个函数而不访问无效的 Foo 指针,它是 UB 吗?
c++ - c++中返回对象的内存分配
从以下代码的最后一行返回的对象会发生什么情况
它会保留在内存中直到完成还是被删除。
c++ - 取消引用地址时是否可以重定向到其他地址?
我有一个相当大的 Visual Studio C++ 代码库,很多人都在修改它。需要删除可能有许多其他对象引用的对象(使用原始指针的地址)。我已尝试尽可能多地删除地址引用,但恐怕仍有一些我没有解决。
所以,我想知道是否有办法将所有对已删除地址的访问重定向到另一个地址,也许是在删除时做一些事情,这样它就不会崩溃?