问题标签 [stack-unwinding]
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++ - 堆栈展开动态创建的对象,其构造函数也作用于堆
当类的构造函数在堆上分配内存时,例如
我有一个功能,例如
如果分配ptr = new bla(1e10)
成功(这意味着,data
并且已size
分配)但构造函数没有成功-> 因为 1e10 太大而引发异常,会发生什么?我没有内存泄漏data = new double [size]
,但是我是否仍然存在内存泄漏double *data
并且int size
在堆上?还是通过堆栈展开清除它们?
我应该这样写更好吗?:
和
编辑:
一个更详细的示例来说明 templatetypedef 答案:
在这个例子中,我可以很好地在我的机器(Win7 4GB RAM)上看到关于资源监视器的内容,它是如何首先进入内部的,但是由于分配第一个调用失败,bla2()
然后在内存处于基线状态时结束(没有),就像在程序中一样开始。bla()
data3
~bla2()
~bla()
catch(...)
当我将 data3 元素的数量设置为仅 1/4 时,所有成功,构造函数和析构函数的调用顺序均符合预期。
c++ - 异常、堆栈展开、封装堆内存、exit()
当抛出异常时,抛出异常的块将从堆栈中展开:
当Object
在堆上分配构造内存并在销毁时正确释放它时,应该没有内存泄漏,因为堆栈展开调用析构函数x
(不是 of y
,而是Object
保证,当构造函数失败时,没有内存泄漏)。还好,不是吗?
让我们深入探讨:
因为受过良好的教育,我想自己清理垃圾,而不是让操作系统来做。我知道,每个现代操作系统都会自行删除程序的堆内存,该程序会意外终止(或预期,但没有明确的释放)。所以在大写的情况下,d
我的操作系统的释放会在操作系统做之前x
正确地释放它的内存(因为堆栈展开和析构函数调用),对吧?
那个怎么样:
之前x
调用的析构函数是否将控制权交还给操作系统? exit
更深入:
之前x
调用的构造函数是否将控制权交还给操作系统?如果是,那么“展开”所有周围的堆栈,包括,对吗? exit
exit
main()
c++ - C++ 和调用栈——它可以用来获取行号吗?
我不太记得 GCC 使用什么库来实现堆栈展开,它用于 C++ 异常和调用跟踪,而且我知道 C++ 规范中没有定义任何方法,所以对此的任何答案都是特定于平台的。我正在使用 GCC 4.9.0。
知道哪里出了问题非常有用,尤其是在调试期间。所以很多时候我会有一些宏来扩展和传递一些东西__LINE__
,并__FILE__
在扩展中。
我不太喜欢这样做,但它会告诉你从哪里调用函数(作为宏__LINE__
并且__FILE__
在调用站点),这真的很方便!
与其使用一些基于构建有条件地定义的可怕宏,不如拥有一些使用堆栈展开库的有条件定义的代码。
使用什么库?编译时可以告诉编译器要记录多少信息?显然,对于发布版本,您只需要异常处理所需的内容。
如果不是,约定是什么?C++ 程序员如何获得 Python 和 Java 程序员认为理所当然的东西——冗长的堆栈跟踪。
我想一个后备但不是很优雅的解决方案是创建一个新的基础,我从中抛出异常并有一个宏来重新抛出和附加行、文件和__FUNCTION__
,但这是一个后备。
我对 GCC 使用的库以及提供给 GCC 以控制其放入多少信息的选项感兴趣,因此请分享您对此的任何知识!
java - 展开到 Java 中递归调用的第一帧?
假设我有一个(非常简单)这样的递归方法:
(第二个条件n == SOME_CONST
只是为了说明有时会发生异常,有时不会发生异常)。
假设我调用myMeth(10)
,并且在几次递归调用(比如 )之后确实发生了异常SOME_CONST == 5
。
有什么技巧可以try-catch
让我回到第一帧myMeth
吗?
c++ - 抛出异常时不执行析构函数(不展开堆栈)
我发现了一种我从未见过的非常奇怪的行为。我正在处理一个复杂的 VS2005 C++ 项目。
Thrower()
当被调用时,您希望在 Trace 输出中看到什么?当堆栈展开时,那个 Tester 被构造然后被破坏,或者不是?
至少我希望如此,但 Tester 的析构函数永远不会被调用!
不可能的 !?!?!?!
这是 Visual Studio 中的错误吗?
我搜索了很多,但甚至在 Stackoverflow 上都没有找到答案。
ios - 如何替换使用 unwindSegue 后弹出的确切视图?
我有一个主菜单,可以通向您玩游戏的视图。从您玩游戏的视图中,您可以单击一个按钮返回主菜单,我为此使用了 unwindSegue。现在有没有办法从主菜单中单击相同的“玩游戏”按钮,替换视图,并保持游戏状态与调用 unwindSegue 之前一样,或者我是否必须将数据重新加载存储在新视图中?
gdb - 如何从列出的 libunwind 和 AddressSanitizer 中获取行号+偏移量?
我经常从 libunwind 或 AddressSanitizer 获取堆栈跟踪,如下所示:
我知道如果我将 gdb 附加到仍然存在的进程,我可以使用它来获取有关位置的详细信息:
但是如果进程已经死了,我不能只是在 gdb 下重新启动它并使用上面的方法,因为地址随机化会使我得到错误的结果(至少,这是我的假设;我显然没有得到有意义的位置)。所以,我尝试了
但是,这要么没有列出任何内容,要么显然是错误的位置。这听起来很简单,但我没有找到答案:-( 平台是 64 位 Linux,但我想这适用于任何平台。
ios - iOS 展开以查看未加载
我面临一个小问题:
启动应用程序时我有类似的东西:
(1) 飞溅视图 --> 我已登录?--> (3) 主页视图 | else (2) 登录视图
因此,当我登录时,我会转到主页视图。当我注销时,我可以放松到登录视图,因为我来自它。
但是,如果我不从登录视图传递并直接重定向到主视图,则注销时我无法放松到登录视图。
有人知道这方面的解决方案吗?
uinavigationcontroller - 如何从 UINavigationController 放松到 UIViewController?
我正在尝试使用从UINavigationController
子类到UIViewController
子类的展开转场。我的问题出现了(我相信),因为我的导航控制器是我的UIWindow
. 我尝试将 my 设置UIViewController
为根,然后在AppDelegate
完成启动之前模态显示导航控制器,但这不起作用,因为视图未添加到层次结构中。
有任何想法吗?
编辑:无论如何要在导航控制器的顶视图控制器上附加一个segue?我有一个相当大的故事板,并且希望避免在多个控制器上重复自己。
ios - 在 didSelectRowAtIndexPath 中使用展开转场?
我有一个根视图控制器A,它将segues推送到表视图控制器B。当在B中选择一行时。我想使用展开segue返回A并将行中的文本传递回根视图A. 然后我使用 prepare for segue 方法来发送限制,如下所示:
但我不知道该怎么做,就是在 didSelectRowAtIndexPath 方法中调用 unwind segue。
我在这里先向您的帮助表示感谢。