Dan*_*ras 0 c++ linux memory windows memory-management
我是新编程,我发现了一个问题,我正在定义一个像这样的c ++数组
double name[512][512]
Run Code Online (Sandbox Code Playgroud)
但是当我在Windows上运行它(它编译没有错误)时它会崩溃.当我在Linux(Ubuntu)上运行时,它运行它应该如何做而没有问题.我认为Windows限制了我的程序可以采取的内存,对吗?我该如何解决?感谢所有能帮助我的人.
我猜测(因为你没有提供MCVE)你的name数组是一个自动变量,所以它在调用堆栈上分配.
顺便说一句,问题不在于RAM(由操作系统管理 ; 用户空间程序不直接使用RAM而是使用虚拟内存),而是在进程的虚拟地址空间(其堆栈段)中.在Linux上,您可以使用/proc/(请参阅proc(5)和pmap(1))来查询进程的虚拟地址空间.并阅读操作系统:三个简单的部分,以了解操作系统的作用.
请注意,在x86-64 sizeof(name)上可能是2097152字节.
调用堆栈的大小有限.在Linux上,通常的限制是4或8兆字节(但有一种方法可以改变它),在Windows上传言它是1兆字节.你有堆栈溢出.
你可能超过了这个限制.考虑使用一些动态内存分配(例如,使用new;但是通过使用更高级别的C++构造,如容器和智能指针,通常应该避免显式使用它).大多数C++标准容器,特别是std::vector(但不是std::array)将它(堆)用于内部数据.
根据经验,每个调用框架应该相当小(例如千字节).
如果你在Linux上编译, 编译器可能会警告你g++ -Wall -Wextra -Wstack-usage=1500 -g.还要学习使用gdb调试器.是害怕的未定义行为.
您还可以使用一些额外的库,如Boost(或其他)提供矩阵,或者拥有自己的Matrix 抽象数据类型(可以堆积分配其数据).注意5的规则
花几周的时间阅读一些优秀的C++编程书,但要注意C++是一种非常困难和复杂的编程语言(因此,请阅读SICP以了解更多通用编程概念并使用一些Scheme实现,如Racket).稍后,您可以阅读一些关于垃圾收集的书(与内存管理相关的概念).
| 归档时间: |
|
| 查看次数: |
198 次 |
| 最近记录: |