我正在做的一个家庭作业要求我们耗尽我们的主内存,以便程序使用虚拟内存,以便我们可以观察和测量减慢。然而,当我达到足够大的内存值时,我会分段错误或崩溃。我需要在耗尽主内存的同时使用虚拟内存,我的印象是windows (或其他操作系统)会解决这个问题,至少在我看来是这样的。我用来观察这个的程序:
#include <stdio.h>
#include <iostream>
#include <chrono>
int sizes[] = { 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536 };
using namespace std::chrono;
int main(int c, char** args)
{
int** A;
int** B;
int** C;
for (int n : sizes)
{
A = new int*[n];
B = new int*[n];
C = new int*[n];
for (int i = 0; i < n; i++) {
A[i] = new int[n];
B[i] = new int[n];
C[i] = new int[n];
}
milliseconds pre_add1 = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
C[i][j] = A[i][j] + B[i][j];
}
}
milliseconds post_add1 = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
milliseconds pre_add2 = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
C[i][j] = A[i][j] + B[i][j];
}
}
milliseconds post_add2 = duration_cast<milliseconds>(system_clock::now().time_since_epoch());
for (int i = 0; i < n; i++) {
delete A[i];
delete B[i];
delete C[i];
}
delete A;
delete B;
delete C;
std::cout << "Size " << n << " took " << (post_add1 - pre_add1).count() << " ms for addition 1" << std::endl;
std::cout << "Size " << n << " took " << (post_add2 - pre_add2).count() << "ms for addition 2" << std::endl;
}
return 0;
}发布于 2020-03-31 07:52:17
每个对new的调用都应该有一个对应的delete调用,每个对new[]的调用都应该有一个对应的delete[]调用。
通过在使用new[]分配的内存块上调用delete,您将导致undefined behavior。这可能是导致崩溃的原因。
要解决此问题,必须更改行
delete A[i];
delete B[i];
delete C[i];至
delete[] A[i];
delete[] B[i];
delete[] C[i];还有那些台词
delete A;
delete B;
delete C;至
delete[] A;
delete[] B;
delete[] C;此外,您可能希望增加页面文件的大小,这样new就不会很快失败。对于Windows7,请参阅this link了解如何增加页面文件大小。
https://stackoverflow.com/questions/60940176
复制相似问题