Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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++ 创建两个或多个超过内存(MSVC)的std::vector时无错误分配_C++_Visual C++_Memory Management_Out Of Memory - Fatal编程技术网

C++ 创建两个或多个超过内存(MSVC)的std::vector时无错误分配

C++ 创建两个或多个超过内存(MSVC)的std::vector时无错误分配,c++,visual-c++,memory-management,out-of-memory,C++,Visual C++,Memory Management,Out Of Memory,我在创建两个向量时发现了一个奇怪的不一致性,这两个向量一起超过了系统的内存(物理和虚拟): 相反,这件作品不会抛出任何不好的东西。如果我构造了更多这样大小的向量,同样的行为也适用: int main() { std::size_t max_size_that_fits_memory = /*...*/; std::vector<int> vec1(max_size_that_fits_memory); std::vector<int> vec2

我在创建两个向量时发现了一个奇怪的不一致性,这两个向量一起超过了系统的内存(物理和虚拟):

相反,这件作品不会抛出任何不好的东西。如果我构造了更多这样大小的向量,同样的行为也适用:

int main() 
{
    std::size_t max_size_that_fits_memory = /*...*/;

    std::vector<int> vec1(max_size_that_fits_memory);
    std::vector<int> vec2(max_size_that_fits_memory);
    //...
    std::vector<int> vecN(max_size_that_fits_memory);
}
intmain()
{
std::size\u t max\u size\u适合的大小\u内存=/*…*/;
向量vec1(适合内存的最大大小);
向量vec2(适合内存的最大大小);
//...
std::vector vecN(适合内存的最大大小);
}

这是怎么可能的?

向量的重要一点是它需要在连续块中分配内存。典型的情况是,可用内存总量足够,但没有连续块可用。例如,这里可以分配多个3x单元块,但不能分配单个6x单元块:


█░░░░░█░░░░█░░░██░░░░░█░░░░█░░░█

那么适合内存的
max\u size\u的值是多少呢。如果不知道您是如何决定“适合内存的最大大小”的,则无法回答此问题。我也很好奇,为什么你希望在你的本地机器上与在云中运行的一些随机虚拟机上一样。Win32或Win64?@VTT它的值是这样的:当实例化
std::vector vec(适合内存的最大大小)
时,它不会抛出bac alloc,但当实例化
std::vector vec时,它抛出坏的alloc(适合内存的最大大小*2)
。这取决于硬件,但问题是,我认为,它与硬件无关。@WernerHenze我使用的是Win64。谢谢,我认为这回答了我的大部分问题。但仍然缺少一些东西。因为在我的系统上,我有16gb的物理内存和15gb的虚拟内存,但我可以实例化10个或更多20gb的向量。这是怎么可能的ble?@Tarquiscani这是另一个问题。通常情况下,虚拟内存的数量远远大于物理内存的数量。我认为典型的Win64运行时至少有100Gb的虚拟内存。另外,您确定您没有交换文件,并且程序实际分配了这些向量,然后正常退出吗?谢谢大家nt,我真是个笨蛋。我发现程序在初始化大量的整数时陷入了困境,没有完成它的执行。这就是为什么没有抛出坏的alloc
int main() 
{
    std::size_t max_size_that_fits_memory = /*...*/;

    std::vector<int> vec1(max_size_that_fits_memory); //Ok...
    std::vector<int> vec2(max_size_that_fits_memory); //Strange, no exception thrown
}
int main() 
{
    std::size_t max_size_that_fits_memory = /*...*/;

    std::vector<int> vec1(max_size_that_fits_memory);
    std::vector<int> vec2(max_size_that_fits_memory);
    //...
    std::vector<int> vecN(max_size_that_fits_memory);
}