I wrote the following piece of code to allocate memory for an array:
try {
int n = 0;
cin >> n;
double *temp = new double[n];
...
}
cat
Calling new double[n]
calls the global operator new
function with a size of n * sizeof(double)
. If operator new
then finds it cannot fulfil the request, it throws an exception.
However, that cannot happen here: the product of n
and sizeof(double)
is so large that it is actually not possible to call operator new
at all, because the size you requested just plain doesn't fit in a size_t
. Implementations vary in how they handle this, but yours evidently aborts the program.
If you want to handle this, you can check that n <= SIZE_MAX / sizeof(double)
before attempting your allocation.
On a 32-bit system, your virtual memory address space cannot exceed 2^31-1 (4294967295) bytes.
You are attempting to allocate 536000000*sizeof(double)
bytes, which is obviously more than that.
If you are using Visual Studio for building, you may want to enable "large memory allocation" in Linker settings.
Go to project Properties -> Linker -> System -> Enable Large Addresses set to "Yes (/LARGEADDRESSAWARE)"