I'm running this code, compiled on 64 bits vc++ 2005, on Windows Server 2008 R2 with 32GB. There is an access violation inside the for loop.
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
double *x = new double[536870912];
cout << "memory allocated" << endl;
for(long int i = 0; i < 536870912; i++)
{
cout << i << endl;
x[i] = 0;
}
delete [] x;
return 0;
}
So if there is no exception in new double[536870912], why am I getting an access violation when doing an assignment over a particular array position?
Another point worth mentioning is that this program was succesfully tested on another computer.
A 64-bit register can theoretically reference 18,446,744,073,709,551,616 bytes, or 17,179,869,184 GB (16 exabytes) of memory. This is several million times more than an average workstation would need to access.
In Go dynamic memory block is allocated mainly using new and make. New allocates exact one memory block that is used to create struct type value, whereas, make creates more than one memory block and returns the reference, like a slice, map or channel value.
The 2 GB limit refers to a physical memory barrier for a process running on a 32-bit operating system, which can only use a maximum of 2 GB of memory. The problem mainly affects 32-bit versions of operating systems like Microsoft Windows and Linux, although some variants of the latter can overcome this barrier.
When you allocate to much the system will usually push some of the data in the RAM to the disk and back into the RAM when it's needed.
It is probably one of the following problem:
I suggest you to test the following code:
#include<conio.h>
#include <iostream>
using namespace std;
#define MYTYPE unsigned long long
int main(int argc, char* argv[])
{
// Test compiling mode
if (sizeof(void*) == 8) cout << "Compiling 64-bits" << endl;
else cout << "Compiling 32-bits" << endl;
// Test the size of mytype
cout << "Sizeof:" << sizeof(MYTYPE) << endl;
MYTYPE len;
// Get the number of <<doubles>> to allocate
cout << "How many doubles do you want?" << endl;
cin >> len;
double *x = new (std::nothrow) double[len];
// Test allocation
if (NULL==x)
{
cout << "unable to allocate" << endl;
return 0;
}
cout << "memory allocated" << endl;
// Set all values to 0
for(MYTYPE i = 0; i < len; i++)
{
if (i%100000==0) cout << i << endl;
x[i] = 0;
}
// Wait before release, to test memory usage
cout << "Press <Enter> key to continue...";
getch();
// Free memory.
delete [] x;
}
Editing: Using this code, i just achieved allocate a single block of 9GB.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With