<分区>
我是新手编程,我发现了一个问题 我正在定义一个像这样的 C++ 数组
double name[512][512]
但是当我在 Windows 上运行它时(它编译没有错误)它崩溃了。当我在 Linux(Ubuntu) 上运行时,它会按应有的方式运行而不会出现问题。我认为 Windows 正在限制我的程序可以占用的内存,对吗?我该如何解决?感谢所有能帮助我的人。
<分区>
我是新手编程,我发现了一个问题 我正在定义一个像这样的 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++ 构造,例如 containers 和 smart pointers,您通常应该避免显式使用它)。大多数 C++ 标准 containers , 特别是 std::vector
(但不是 std::array
)将它(堆)用于内部数据。
根据经验,每个调用帧应该相当小(例如千字节)。
如果你编译with,编译器可能会警告你g++ -Wall -Wextra -Wstack-usage=1500 -g
在 Linux 上。学习也use the gdb
debugger .是 afraid的 undefined behavior .
您还可以使用一些额外的 library喜欢Boost (或其他东西)提供矩阵,或拥有自己的 Matrix
abstract data type (这将堆分配其数据)。注意 rule of 5
花几周时间阅读一些好文章 C++ programming book ,但请注意 C++ 是一种非常困难和复杂的编程语言(因此另请阅读 SICP 以了解更多通用编程概念并尝试一些 Scheme 实现,例如 Racket )。稍后,您可以阅读一些 book在 Garbage collection (那里的概念与 memory management 相关)。
关于c++ - 为什么我的 C++ 代码在 Linux 上运行而不在 Windows 上运行,RAM 内存有问题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50094457/