C++ std::vector或其他允许迭代的动态容器能否部分驻留在RAM和swap(Linux)中?
我有一个文本处理应用程序,它在代码中使用C++ std::vector或其他允许迭代的动态容器能否部分驻留在RAM和swap(Linux)中?,c++,memory-management,stdvector,C++,Memory Management,Stdvector,我有一个文本处理应用程序,它在代码中使用std::vector来存储巨大的数组、表格等。当我挖掘巨大的文本时,当遇到RAM边缘时,应用程序崩溃,而不进入交换 不幸的是,崩溃消息并没有提供信息,它只是SEGFULT。当然,有很多可能性可以使用调试器进行调查,但不管这种情况如何,我对一件引起我注意的事情感到好奇: 无论何时声明向量对象,它都会保留一些连续属性 内存中的空间。如果在插入过程中,其值超过 容量,它会在内存中创建一个新的带有缓冲区的空间,复制 从向量中删除数据,插入新数据,并销毁旧内存 如
std::vector
来存储巨大的数组、表格等。当我挖掘巨大的文本时,当遇到RAM边缘时,应用程序崩溃,而不进入交换
不幸的是,崩溃消息并没有提供信息,它只是SEGFULT。当然,有很多可能性可以使用调试器进行调查,但不管这种情况如何,我对一件引起我注意的事情感到好奇:
无论何时声明向量对象,它都会保留一些连续属性
内存中的空间。如果在插入过程中,其值超过
容量,它会在内存中创建一个新的带有缓冲区的空间,复制
从向量中删除数据,插入新数据,并销毁旧内存
如果您的程序要执行大量插入和删除操作,请使用
std::list
当应用程序(我特别感兴趣的是std::vector
)请求创建一个超过RAM大小的连续对象时,即使在交换中有一个位置,它也会抛出错误吗
我是否可以操作一个动态数组,该数组驻留在RAM中,并与std::list
或其他容器交换
谢谢大家,很抱歉这个问题!这不是我的计划,我只是想让它发挥作用,这个想法让我好奇。所以看起来这只是一个巧合,当接近我的RAM大小时,它崩溃了。交换对程序操作是透明的。当你的程序实际使用一个特定的内存页时,它将被带到主内存中,但在其他任何时候,操作系统都可以自由地将它移动到交换位置,你的程序将完全不知道这一事实
segfault表示您试图访问无效地址(用于读取或写入)。否,
std::list
存储数据的方式与std::vector
或其他容器类的存储方式根本不同,因此无法交换。交换对应用程序来说是透明的,你不需要任何容器来工作。所以std::vector
能够做到这一点。您的程序中有一个bug。这里的“连续”与您拥有的RAM量无关。即使内存不足,vector也不会出错。相反,它会抛出std::bad_alloc
@Slowpoke,由于操作系统的特殊性,程序有时可以分配更多:DThanks!所以交换只是扩展地址,操作系统不会阻止应用程序分配一个比物理RAM大的内存块。好的,谢谢!请原谅,如果这个问题太难回答,而这个应用程序不是我的,我只是在尝试使用它。