c++ - 为什么我的 C++ 代码在 Linux 上运行而不在 Windows 上运行,RAM 内存有问题吗?

标签 c++ linux windows memory memory-management

<分区>

我是新手编程,我发现了一个问题 我正在定义一个像这样的 C++ 数组

double name[512][512]

但是当我在 Windows 上运行它时(它编译没有错误)它崩溃了。当我在 Linux(Ubuntu) 上运行时,它会按应有的方式运行而不会出现问题。我认为 Windows 正在限制我的程序可以占用的内存,对吗?我该如何解决?感谢所有能帮助我的人。

最佳答案

猜测(因为您没有提供 MCVE)您的 name 数组是 automatic variable , 所以它被分配在 call stack 上.

顺便说一句,问题是 在 RAM 中(由 operating system 管理;user-space 程序不直接使用 RAM,而是 virtual memory)但在 virtual address space (它的栈段)你的 process .在 Linux 上,您可以使用 /proc/(参见 proc(5)pmap(1))来查询进程的虚拟地址空间。并阅读 Operating Systems: Three Easy Pieces了解操作系统的作用。

请注意,在 x86-64 上 sizeof(name) 可能是 2097152 字节。

调用堆栈的大小有限。在 Linux 上,通常的限制是 4 或 8 兆字节(但有一种方法可以改变它),在 Windows 上据说是 1 兆字节。你有一个 stack overflow .

您可能超出了该限制。考虑使用一些 dynamic memory allocation (例如使用 new ;但是通过使用更高级别的 C++ 构造,例如 containerssmart pointers,您通常应该避免显式使用它)。大多数 C++ 标准 containers , 特别是 std::vector (但不是 std::array)将它(堆)用于内部数据。

根据经验,每个调用帧应该相当小(例如千字节)。

如果你编译with,编译器可能会警告你g++ -Wall -Wextra -Wstack-usage=1500 -g 在 Linux 上。学习也use the gdb debugger .是 afraidundefined behavior .

您还可以使用一些额外的 library喜欢Boost (或其他东西)提供矩阵,或拥有自己的 Matrix abstract data type (这将堆分配其数据)。注意 rule of 5

花几周时间阅读一些好文章 C++ programming book ,但请注意 C++ 是一种非常困难和复杂的编程语言(因此另请阅读 SICP 以了解更多通用编程概念并尝试一些 Scheme 实现,例如 Racket )。稍后,您可以阅读一些 bookGarbage collection (那里的概念与 memory management 相关)。

关于c++ - 为什么我的 C++ 代码在 Linux 上运行而不在 Windows 上运行,RAM 内存有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50094457/

相关文章:

c++ - 在 64 位窗口中与 qt 静态链接时出错

c++ - 将 64 位位集转换为二进制字符串表示形式似乎是特定于编译器的失败

c++ - CreateTexture2D 失败... (d3d)

c++ - 为什么 "using namespace std;"被认为是不好的做法?

linux - 将文件名添加到linux中的空文件

c - 在c中使用bash进入文件夹

c - 无法计算Linux内核执行C语言编写的hello world程序所花费的时间

c++ - 补充 GetCommandLine 以获取参数计数?

c++ - 有没有办法获取在目录中创建(使用类似 fopen() 之类的东西)或删除文件(使用 rm)的进程的 pid?

c++ - Winsock 重新定义错误