问题标签 [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.
pointers - 在 Windows API 应用程序定义的回调函数中,指针参数数据的生命周期是多少?回调返回后它是否仍然存在?
作为一个例子,让我们看一下EnumWindowStations()
,它需要调用者传递一个EnumWindowStationsProc()
回调函数。当前终端会话中的每个窗口站都会调用一次回调函数。我们看一下回调函数的签名:
第一个参数是指向字符串数据的指针。是否为回调调用显式分配了该字符串缓冲区,是否会在回调返回后立即释放,或者可能在枚举函数返回之前立即释放?或者,指针是否指向某种持久内存,这样字符串缓冲区将在之后保持分配和可用?
这一点很重要,因为如果它不是持久的,那么将原始指针存储在全局容器中以在回调和完整枚举过程完成后访问是不正确的。相反,有必要在回调返回之前将底层字符串数据复制到由应用程序控制的缓冲区。
官方文档似乎没有明确说明字符串数据的生命周期是什么。参数描述中只有一行:
lpszWindowStation [输入]
窗口站的名称。
文档页面上没有任何地方谈论字符串数据的生命周期。我也不记得曾经找到过“一劳永逸”地回答这个问题的 MSDN 页面,即所有使用 Windows API 中的回调习语。
目前我对EnumWindowStations()
/EnumWindowStationsProc()
案例最感兴趣,但最好是回答者解决一般案例,即所有 Windows API 回调函数的假设。
c++ - CreateFile2、WriteFile 和 ReadFile:如何强制 16 字节对齐?
我正在使用 CreateFile2 和 WriteFile 创建和写入文件,然后使用 readfile 一次将 16 个字节读取到 __m128i 中,然后对其执行 simd 操作。在调试模式下工作正常,但在发布模式下抛出拒绝访问 (0xc0000005) 错误代码。以我的经验,当我试图将非 16 字节对齐的东西推入 16 字节对齐的东西时,就会发生这种情况。但是,我不确定缺乏 16 字节对齐首先在哪里引起了它的丑陋。
它在 CreateFile2() 调用中吗?
...在 WriteFile() 调用中?
...在以后的 ReadFile() 调用中?
如何在此处强制执行 16 字节对齐?
谢谢!
c++ - 检测对临时的悬空引用
Clang 3.9 非常重用临时人员使用的内存。
此代码为 UB(简化代码):
我们有大量类似上面的代码(my_optional
只是一个简单的例子来说明它)。
因为 UB 所有的 clang 编译器从 3.9 开始重用这个内存,这是合法的行为。
问题是:如何在编译时检测这种悬空引用,或者在运行时使用 sanitizer 之类的东西?没有clang消毒剂可以检测到它们。
更新。请不要回答:“使用std::optional
”。仔细阅读:问题与它无关。
更新2。请不要回答:“你的代码设计不好”。仔细阅读:问题与代码设计无关。
c++ - 防止编码器错误 - 通过引用返回临时值(悬空指针)
如何防止编码器返回局部变量作为参考?
示例 1
我有时会犯这样的错误:-
正确的代码是:-
示例 2
另一种情况是:-
正确的代码是:-
可能只有我一个人,因为我对 C++ 不够熟练。
然而,这些事情每 3 个月发生一次,尤其是在糟糕的时候。
问题: 什么编程技术/设计模式/软件工程术语/C++ 魔法/工具/插件可以帮助我减少这种特定类型的错误发生率?
我正在使用 Visual Studio。
c++ - 无法解释为什么在创建指针向量向量时指针变得悬空
考虑以下代码:
类中的Generate
方法Generator
将简单地将向量的向量int
s 转换为指针向量的向量SomeClass
。
SomeClass
只是一个int
带有 getter 方法的简单值的容器。
我希望得到以下输出:
但是,我得到以下输出:
第一行的指针似乎变成了悬空指针。这段代码有什么问题?
c - fflush() 在悬空指针方面做了什么?
我遇到了这个页面,该页面说明了创建悬挂点的常用方法。
下面的代码用于通过返回局部变量的地址来说明悬空指针:
在运行它时,这是我得到的编译器警告(如预期的那样):
这是我得到的输出(到目前为止很好):
但是,当我注释掉 fflush(stdout) 行时,这是我得到的输出(带有相同的编译器警告):
这种行为的原因是什么?fflush 命令的存在/不存在究竟是如何导致这种行为变化的?
c++ - 内部 lambda 中的悬空引用
我有一个内部 lambda,它使用外部 lambda 的引用变量之一,如下所示:
我试过了。它运作良好。但是,我想确保这里没有悬空引用。在那儿?
c - Clang 的 ASan 未检测到悬空指针的使用
在工具比较的上下文中,如果 ASan 可以检测到以下程序中的问题,我不想对它不公平:
第二次的G
第一次出现f
被称为调用未定义的行为,因为G
在那一点上是不确定的。此外,G
立即取消引用,这使得 ASan 可能会检测到这种内存错误。这是 ASan 规范的一部分,它有时无法检测到它应该找到的那种问题,但我想知道我是否可以使用它在这里找到这个特定问题。
我在-fsanitize-address-use-after-scope
这里找到了这个选项,但是这个选项在我使用的 Clang 版本中不起作用:
是否有 ASan 版本在执行上述程序时标记错误,有或没有特殊的命令行选项?
reference - 确定对象是否已被破坏的惯用方法
我一直在尝试找到一种更好的方法来确定特定对象是否已被破坏(destroy(...)
)。我一直这样做的方式是这样的:
然后你做:
我看不出这有什么问题(也许有人可以告诉我其他问题),除了它占用内存并需要放入valid = true;
每个构造函数(并且很丑,因为它使用来自被破坏对象的变量)。当然,最好的情况是有一些神奇的功能,可以告诉你某个对象是否有效valid(c); // true / false
。
所以我的问题是是否有一些标准方法来确定对象是否已被销毁(例如,gc 没有收集该内存位置,并且有效对象位于该位置而没有对 vtable 的引用)并且指针现在几乎悬而未决?如果没有任何好的方法可以做到这一点,那么作为次要问题:这种方法在任何可预见的方面是否危险?
以前,我确保对于来自对象 A -> B 的每个引用,都有一个引用 B -> A,并且在应用破坏 A 的析构函数后,B 对 A 的引用无效。所以我什至不必检查 A 是否被破坏。但是当您想要添加新的引用类型时,这是非常乏味和耗时的,因为您必须同时修改可销毁类 (A) 和引用类 (B)。从理论上讲,这就像在程序的参考图中总是有一个可确定的循环(或类似的东西);这可能是一个非常有趣的主题。
如果我是个白痴,请提前道歉。
c++ - 实现对象列表时如何处理动态分配?
我必须实现一个看起来像这样的函数:
该函数采用两个列表并将每个对象的总和放入一个新列表中。该类MyList
具有指向next
变量的节点,并且列表中的对象是用户定义的。
这让我开始思考——我应该如何处理对象和列表本身的内存动态分配?因为我必须为新列表的每个对象创建内存。
有没有办法将对象总和的值放在新列表中而不必依赖动态分配?也许通过做这样的事情:
而不是这个:
我应该如何处理函数内部创建的新列表的生命周期与函数结束后将保存内存的变量相关?返回新列表时我可以这样做吗?
简而言之,我的主要疑问是如何处理在函数内部创建并由其他对象持有的对象的生命周期。