问题标签 [stack-memory]

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 投票
5 回答
2411 浏览

c++ - 在堆上创建一个静态数组?

我需要创建一个非常大的数组。让我们说 50 兆字节。

我可以安全地将它创建为普通的静态数组吗?编译器会将其放入堆栈(可能会导致堆栈溢出),还是会足够聪明地将其放入堆中?

如果没有办法这样做,是否有一种简单的方法可以在程序启动时使用 malloc 或“new”,但在程序结束时自动释放它?

0 投票
3 回答
320 浏览

c - C中的内存分配

如何检查我的堆、堆栈等位于内存的哪些部分?我目前正在查看 C 中的一个程序,在查看 .elf 文件时,我可以看到程序正在使用哪些内存地址,但我不知道它是在堆中还是在堆栈中。

0 投票
2 回答
15286 浏览

c - 内存中的字符串文字在哪里?堆栈/堆?

可能重复:
C 字符串文字:它们去哪儿了?

据我所知,

一般来说,指针必须由malloc()分配,然后分配到堆,然后由free()取消分配;

非指针(int,char,float,etc..) 会自动分配到栈中,只要函数返回就不会分配

但是,从以下代码:

a分配到哪里?堆栈还是堆?

0 投票
3 回答
19676 浏览

c++ - 从函数返回向量而不被破坏

我遇到了一个有趣的问题。我在 C++ 中有一个函数,它返回一个充满类的向量。返回向量后,它会为向量中的每个元素调用解构器。

问题很明显:数据在类指向指针的地方被销毁,当对象被销毁时这些指针被释放。我只能假设调用解构函数是因为向量在堆栈上,而不是在堆上。

所以问题是:

无论如何要继续从函数返回向量,而不会被破坏?或者我是否必须传递一个指针以返回向量作为函数的输入?

0 投票
1 回答
1672 浏览

winapi - 解释 App Verifier 输出:堆损坏或将堆栈地址误解为堆地址?

我们有一个测试用例,它使我们基于 MFC 的大型应用程序因堆损坏错误而崩溃。

我使用 App Verifier 为有问题的 DLL 打开了页面堆(不幸的是,由于其他原因,为整个进程打开堆是不可行的。)验证器没有给我们提供比我们已经拥有的更多的信息。它与原始崩溃在同一点触发。

现在我有两个相互竞争的理论。您认为哪种理论更有可能是正确的,您的下一步是什么?

  1. 这确实是堆损坏。验证程序没有捕捉到原始损坏,因为它发生在另一个 DLL 中。我们应该尝试为更多 DLL 激活验证程序,并确定哪些代码正在破坏堆。
  2. 堆很好;问题是我们将堆栈地址视为堆地址。我们应该进一步研究此调用堆栈中的代码以找出问题所在。

我倾向于#2,因为 free() 的参数看起来像一个堆栈地址,但到目前为止,没有人提出解释如何实现这一点。

这是调用堆栈的片段。MyString 是 CString 的简单包装器。MyAppDll 是设置为使用页堆的 DLL。

以下是 free() 堆栈帧内的寄存器:

这是应用验证程序消息:

0 投票
3 回答
284 浏览

c++ - C++ 动态与堆栈对象以及如何使用它们

我总是在堆上动态分配;我已经完成了很多 Objective-C 编程以及普通 C 编程,并且由于我通常处理大块内存,所以堆对象是防止堆栈溢出所必需的。

最近有人告诉我,在 C++ 中不鼓励使用动态分配的对象,应尽可能使用堆栈对象。为什么是这样?

我想说明这一点的最好方法是举例:

这将创建 2 个对象,将它们存储在指针中,然后main()在每个对象上调用一个方法。该Class对象创建 achar*并将 C 字符串存储"Hello!"在其中;释放~Class()器释放内存。该方法使用doSomething()打印出来。很简单。现在让我们运行它:"buff: %s"printf()

Dealloc
Buff:你好!
增益:¯ø_ˇ

哇,怎么了?即使我们存储了指向它的指针,C++ 也会释放_obj2它;那是因为它在堆栈上而不是堆上,而且 C++ 没有像 Objective-C 那样的保留计数机制(我尝试一次实现一个;它工作得很好,但我不想将它作为超类添加到所有内容中)。所以我们必须在函数返回后跳过箍来保持它。

0 投票
7 回答
8155 浏览

c++ - 如何在堆栈和堆对象之间进行转换

例子:

这将创建 2 个对象,创建指向它们的指针,然后 main() 在每个对象上调用一个方法。Class 对象创建一个 char* 并存储 C 字符串“Hello!” 在里面; ~Class() 释放器释放内存。doSomething() 方法使用 printf() 打印出“buff: %s”。很简单。现在,如果我们运行它,我们会得到:

Dealloc
Buff:你好!
增益:¯ø_ˇ

显然堆栈对象在这里不起作用- 很明显,当函数退出时,指针 _obj2 指向堆栈中的某个位置。这就是我在上一个问题中使用堆对象的原因,人们告诉我这是“愚蠢的”。

所以,第一个问题是:如果我如何将堆栈对象(obj2)转换为堆对象,以便在 create() 退出后它不会被释放?我想要一个直截了当的答案,而不是像许多人那样傲慢的“你做错了”。因为在这种情况下堆栈对象无法工作,所以堆对象似乎是唯一的方法。编辑:此外,转换回堆栈对象也很有用。

第二个问题:堆对象“错误”的具体示例是vector<string>*使用new运算符创建一个新对象。如果动态分配 STL 对象是错误的,那么正确的方法是什么?显然,如果您将它们创建为堆栈对象,它会失败,因为它们会立即被释放,但我被告知(再次,一个非常高级的成员)动态分配它们会破坏堆。那么正确的方法是什么?

0 投票
3 回答
678 浏览

c++ - 建议动态分配还是自动创建子系统?

我是一名爱好者 C++ 程序员,目前正在开发一款游戏(使用 Ogre3D),我对我的主类的内存分配有疑问。

我已经阅读了很多关于内存分配,在堆栈上自动分配和在堆上动态分配,以及它们的区别(性能,有限的堆栈大小)。我仍然不确定我的主类(应用程序)和其他一些“工厂”类(由应用程序类的单个实例创建)使用什么,它们在整个执行过程中都存在一个实例。

以下是布局的简化片段:

在堆栈或堆上分配内存更好(应用程序类和工厂类)?通过什么论据?

提前致谢!

0 投票
3 回答
426 浏览

c++ - 关于 C++ 内存管理的基本问题

通常我不关心内存,但我想清楚地了解,在什么内存中cat1' 和'cat2存在?在堆栈中还是在堆中?ab

@BoPerson:你说得对,我应该使用b = new int(0). 但对我来说更有趣的是,在堆中创建a对象时变量在哪里?在堆中,也是?还有堆中的指针,它指向堆中的内存,对吗?Catab

0 投票
2 回答
5059 浏览

haskell - Haskell 编译器如何决定是在堆上分配还是在栈上分配?

Haskell 没有显式内存管理功能,所有对象都是按值传递的,因此也没有明显的引用计数或垃圾收集。Haskell 编译器通常如何决定是生成在堆栈上分配的代码还是在堆上为给定变量分配的代码?它是否会始终如一地在不同的调用站点为同一函数分配相同的变量?当它分配时,它如何决定何时释放内存?堆栈分配和释放是否仍以与 C 中相同的函数进入/退出模式执行?