问题标签 [stack]

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 投票
8 回答
17190 浏览

c - 声明大数组时出现堆栈溢出异常

以下代码为我生成堆栈溢出错误

我该如何解决这个问题?我正在使用 Turbo C++,但想将我的代码保留在 C 中

编辑:

感谢您的建议。上面的代码只是举例,我实际上在函数中声明了数组,而不是在 sub main 中。此外,我需要将数组初始化为零,所以当我搜索 malloc 时,我发现 calloc 非常适合我的目的。

Malloc/calloc 也比在堆栈上分配的优点是允许我使用变量声明大小。

0 投票
4 回答
1717 浏览

c - Is there a cheaper way to find the depth of the call stack than using backtrace()?

My logging code uses the return value of backtrace() to determine the current stack depth (for pretty printing purposes), but I can see from profiling that this is a pretty expensive call.

I don't suppose there's a cheaper way of doing this? Note that I don't care about the frame addresses, just how many of them there are.

edit: These logging functions are used all over a large code-base, so manually tracking the stack depth isn't really an option.

0 投票
5 回答
1734 浏览

c - Unix 上的分段错误 - 可能的堆栈损坏

我正在查看在 Unix 中运行的进程的核心。通常我可以解决问题并深入回溯以尝试识别内存问题。在这种情况下,我不确定如何进行。

首先,回溯只给出了 3 帧,我期望更多。对于那些帧,所有呈现的函数参数似乎完全无效。没有我所期望的。

一些指针参数与它们相关联 - 无法访问地址处的内存

这是否表明某种完整的堆栈损坏。我用 libumem 运行了这个过程,所有的缓冲区都被报告为干净的。

umem_status 也没有报告任何内容。

所以基本上我很难过。可能的原因是什么?我应该在代码中寻找什么,因为 libumem 似乎没有报告任何错误。

关于如何进一步调试的任何建议?我应该考虑 mdb 中的任何额外功能吗?

谢谢你。

0 投票
10 回答
57625 浏览

c++ - 在 C++ 中正确使用堆栈和堆?

我已经编程了一段时间,但主要是 Java 和 C#。我从来没有真正需要自己管理内存。我最近开始使用 C++ 进行编程,对于何时应该将内容存储在堆栈中以及何时将它们存储在堆中感到有些困惑。

我的理解是,经常访问的变量应该存放在栈和对象上,很少使用的变量,大数据结构都应该存放在堆上。这是正确的还是我不正确?

0 投票
2 回答
1748 浏览

c++ - 如何将用 swig 包装的 c++ 类的实例推送到 lua 堆栈上?

我有一个用 swig 包装的类,并用 lua 注册。我可以在 lua 脚本中创建此类的实例,并且一切正常。

但是假设我有一个在我的 C++ 代码中创建的类的实例,并调用了 new X,并且我有 la lua_state L,其中有一个我想调用的函数,它接受一个参数,一个 X 的实例......我如何调用该函数。这是(一些)有问题的代码(我省略了错误处理的东西):

主文件

主菜单.lua

目前,我发现可以工作的只是从 swig 生成的 cpp 文件中公开一些功能,然后调用它。由于几个原因,这很糟糕......如果我有多个模块并且我不得不更改 swig 文件中的默认链接规范(使用 -DSWIGRUNTIME=),它将无法工作。

我将以下内容添加到 main.cpp

它得到一个指向模块的指针,然后是指向类型的指针,然后调用 swigs 函数来注册它。不得不挖掘一个不应该是人类可读的文件(所以它在文件的顶部说)而且只是混乱,这是一件不合理的事情!(但它确实有效!)

当然,有更好的方法来完成我正在尝试做的事情。

PS 从高级 pov 我想要的是让 lua 不引用由 GuiInst 中的对象工厂创建的 Gui 组件,以防我遇到这个错误。这是我第一次向脚本语言公开功能,除了一些非常简单(和非 swig)的 python 模块,所以我准备接受建议。

感谢您的任何建议!


RBerteig 对评论的回应

当 swig 运行以防止 lua 构造它的实例时,GuiInst 的构造函数是 #defined 私有的,所以这对我不起作用。我试图阻止的是以下(在lua中):

它将调用“g=new GuiButton”,然后将其注册到 GuiRegionVertical(由于各种原因需要存储一个指针),然后调用“delete g”,并且 GuiRegionVertical 留下了一个指向 g 的悬空指针。

我怀疑真正需要发生的是 GuiRegionVertical::Add(GuiButton*) 应该增加 GuiButton* 的引用计数,然后 GuiRegionVertical 的析构函数应该减少其所有内容的引用计数,尽管我不确定这应该如何痛饮就完事了。

这将消除对私有构造函数、Gui 对象工厂和讨厌的外部对象的需要。

我要解决这个错误吗?

谢谢。

0 投票
6 回答
789 浏览

c++ - 如何确定一个对象是否应该在堆栈上?

我一直在寻找在 C++ 中在堆栈或堆上分配对象的经验法则。我在这里找到了很多关于 SO 的讨论。很多人说,这关乎一个物体的生命周期。如果您需要比函数范围更长的生命周期,请将其放入堆中。这很有意义。

但是让我感到困惑的是,许多人说,如果对象很小,就将它们分配给堆栈。如果对象很大,则将其放入堆中。但是他们都没有说如何识别物体是否大?

我有以下问题,

  1. 如何识别物体是否大?
  2. 堆栈的最大大小是多少?每个操作系统会有不同的堆栈大小?
  3. 我有一个包装类vector<string>。它将有大约 100 个项目。如果我将此类分配给堆栈,它会导致堆栈溢出吗?我试过这个,但效果很好。不确定我做错了什么。
0 投票
4 回答
2263 浏览

c++ - 在结构化异常的情况下展开堆栈

这个问题更清楚地说明了这里描述的问题。我做了更多调查,发现堆栈展开没有发生在以下代码中:

我使用 VC6 SP5 编译器编译了这段代码,输出为“Wrapper constructor :: AddRef !!!” (即未调用在堆栈上构造的包装器对象的析构函数。这是预期的行为吗?还是 VC 编译器的错误?我可以使用一些编译器标志以便在这种情况下发生堆栈展开吗?

0 投票
1 回答
677 浏览

64-bit - 64 位线程开销

64 位窗口上的线程开销是多少?我相信堆栈的用户空间为 1mb,而 32 位的内核空间则较少。

谢谢

0 投票
4 回答
2372 浏览

algorithm - 设计一个也可以在 O(1) 摊销时间内出列的堆栈?

我有一个抽象数据类型,可以看作是从左到右存储的列表,有以下可能的操作: Push:向列表左端添加一个新项目 Pop:删除列表左端的项目 Pull :删除列表右端的项目

使用三个堆栈和恒定的附加内存来实现这一点,以便任何推送、弹出或拉取操作的摊销时间都是恒定的。堆栈具有基本操作,isEmpty、Push 和 Pop。

摊销时间的意思是“如果我花这么多时间,我可以再花一部分时间,并将其存储在时间银行中以备后用。” 就像每次推送操作一样,花费三个常量时间块,所以对于每个推送的元素,你有 2 个额外的常量时间块。

0 投票
3 回答
3731 浏览

javascript - JavaScript 中的堆栈操作

我正在用 JavaScript 实现一个堆栈。

考虑:

现在用户弹出值 2:

这是堆栈的可接受行为吗?我正在滚动自己的堆栈,但是是否有任何内置代码可以为我做到这一点?

我的代码:

如果堆栈不是此应用程序的正确数据结构类型,那么正确的数据结构是什么?