Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::vector或其他允许迭代的动态容器能否部分驻留在RAM和swap(Linux)中?_C++_Memory Management_Stdvector - Fatal编程技术网

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大的内存块。好的,谢谢!请原谅,如果这个问题太难回答,而这个应用程序不是我的,我只是在尝试使用它。