问题标签 [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 投票
2 回答
718 浏览

c++ - 无法从堆栈对象中捕获异常

希望你今天过得愉快。

我正在研究一个类来包装 Berkley C Networking API,到目前为止,我只得到了一个 TCP 服务器/客户端。

具有讽刺意味的是,我遇到的问题不在于网络,而在于堆栈和堆。也许我根本不完全理解它,但是当我使用类似的东西时: ClientSocket *mysock = new ClientSocket(); 并且只需使用 -> 运算符调用函数,它就可以正常工作 - 如果发生错误,我的 SocketException 类会被捕获没有问题。

但是,当我使用: ClientSocket mysock; 并且在使用 . 运算符,它显示: terminate called after throwing an instance of 'SocketException' Aborted 只是让我回到终端提示符。

忘了补充,我将调用包装在 try/catch 块中。

我知道第一个示例是使用“new”关键字返回指向堆上新 ClientSocket 实例的指针,第二个示例用于堆栈,但我不知道问题所在。

我在想我错过了一些关于指针/引用/堆栈/堆的东西,但我不知道发生了什么。代码通常运行得很好,但是如果抛出任何异常...... >:(

编辑:在链接页面上,Client.cxx 和 Server.cxx 是示例文件!感谢您指出这一点,埃里克。对此的帮助将不胜感激。该项目的来源位于:
所有文件的链接:http: //furryhead.co.cc/problem.html
(我不能粘贴超过 2 个链接,而且我有 4 个文件,所以必须这样做,直到有人可以将链接合并到我的帖子中)注意:Socket.cxx 相当大,因为它包含 ServerSocket、ClientSocket 和 SocketException 定义。

编译上述所有文件的命令是:
g++ -c Socket.cxx -o Socket.o
g++ -c Server.cxx -o Server.o
g++ -c Client.cxx -o Client.o
g++ Server.o Socket.o -o 服务器
g++ Client.o Socket.o -o 客户端

谢谢!

很少更新,根据 Jon 的建议,我查找了套接字函数的文档,现在它有更好的错误报告——我检查了 'errno' 变量并基于它抛出异常。(那个,而且我没有将它设置为非阻塞......;)) - 只是想更新并表示感谢!:D

0 投票
2 回答
334 浏览

c - 存储在全局链表中的本地结构(并在其他函数中访问)在 VC2010 中有效。这是正确的 C99/ANSI 吗?

以下代码工作正常:

该结构是在除 main 之外的函数中本地创建的,但我能够从 localstructtest() 范围之外的链表中检索数据。局部变量是在堆栈上创建的,这个结构也是如此吗?或者它实际上是在堆上创建的并且指针/引用仍然有效?当我测试它时,我预计这会失败。我承认我是一名 C++ 程序员,我可能并不完全理解 C 中没有传递引用的后果。如果可以像这样使用结构数据,那么数据什么时候得到释放?

谢谢!

0 投票
2 回答
1827 浏览

c - getaddrinfo addrinfo 导致堆栈或堆

至少我有点困惑。getaddrinfo() 调用“更新”指向 addrinfo 结构的指针,当我要在同一范围(该函数)中使用 addrinfo 时,一切都很好,但是如果我将结构复制到另一个结构(通过分配它)会发生什么。

请帮助我了解正在进行的基础知识(不寻求替代方法的建议)。

如果我错了,请纠正我:a) getaddrinfo() 需要一个指向 addrinfo 的 struct-pointer 的指针。b) getaddrinfo 在当前函数范围内创建一个 addrinfo 结构并更新 a) 中所需的指针

现在我真正的问题是:我想将该 addrinfo 存储在其他地方。使用分配给另一个指针不会进行深度复制,并且在函数之后所有指针都变得无效?

最好举一个极其简化的例子:

直接在 getaddrinfo 上使用 &update 似乎不起作用,因为问题仍然存在:原始结构在函数范围结束后被销毁。

任何人都可以在这里给我更多的见解(请解释什么在哪里创建和在哪里销毁,堆栈,堆所有信息都是受欢迎的)

0 投票
1 回答
196 浏览

.net - 在 .NET 中初始化字符串和不初始化字符串之间的区别

我想知道在使用 new 关键字初始化字符串以及在没有 new 关键字的情况下为字符串设置值时如何分配内存。

阿比舍克·斯里坎特

0 投票
2 回答
1226 浏览

.net - 堆栈和堆查看器

是否有适用于 .NET 的免费堆栈和堆查看器,它显示在堆栈和堆上分配了哪些类型。我需要这个来进行我将要进行的培训。

0 投票
5 回答
503 浏览

memory - 内存中的堆栈实际上是堆栈吗?

在内存中有一个称为堆栈的部分,它从顶部开始并向下增长到堆。这个堆栈和 LIFO 堆栈是一样的吗?底部的堆是 FIFO 吗?

当您执行“push”和“pop”时,是否会改变内存中的堆栈?

0 投票
5 回答
1432 浏览

c++ - C++ 堆内存性能提升

我正在编写一个需要大量堆内存的函数。是否可以告诉编译器这些数据将在特定for循环中被频繁访问,从而提高性能(通过编译选项或类似方法)?

我不能使用堆栈的原因是我需要存储的元素数量很大,如果我尝试这样做会出现分段错误。

现在代码正在运行,但我认为它可能会更快。

更新:我正在做这样的事情

一些细节:
- 我使用了 hash_set,几乎没有改进,除了 hash_set 并非在我拥有的所有机器中都可用以用于模拟目的
- 我尝试使用数组在堆栈上分配 vec 但是,正如我所说,如果我可能会遇到分段错误元素数量太大

例如,如果 node_vec.size() 等于 k,其中 k 大约为几千,我希望 vec 比 node_vec 大 4 或 5 倍。考虑到我必须多次运行它,使用这个数量级的代码似乎很慢。当然,我使用多线程来并行化这些调用,但我不能让函数本身运行得比我现在看到的快得多。

例如,是否有可能在高速缓存内存中分配 vec 以进行快速数据检索,或类似的东西?

0 投票
3 回答
434 浏览

.net - 堆栈内存位置

我知道堆内存是内存的一部分。但是堆栈内存也是ram的一部分或堆栈内存是cpu寄存器的一部分。.net4.0 应用程序的堆栈内存的默认大小是多少

0 投票
3 回答
15811 浏览

assembly - pop or add esp, 4 ? What is the difference?

I saw this question, but I didn't find my answer in it..

So, why would I prefer to use add esp, 4 or add esp, 8 instead of using pop one or two times? Is there any difference (performance, safety, etc.) at all or it's a matter of personal choice?

0 投票
2 回答
1046 浏览

performance - 递归和非递归实现之间的速度比较

我有一个复杂的算法,它使用非常深的递归。因为某些特定数据存在堆栈溢出,所以我尝试在不递归的情况下重写它(使用堆上的外部堆栈)。所以我对同一算法进行了两次修改。然后我进行了一些测试,我发现递归实现的时间比另一个快得多。

有人可以向我解释一下吗?讨论这些结果是我最后一个大学项目的一部分(为什么一个实现比另一个快得多)。我认为这是因为堆栈和堆的缓存不同,但我不确定。

非常感谢!


编辑

好的,有代码。该算法是用 C++ 编写的,解决了树同构问题。除了比较两个节点的一种方法之外,这两种实现都是相同的。比较是递归定义的——如果一个节点的一个子节点小于另一个节点的相应子节点,则一个节点小于另一个节点。

递归版本

非递归实现