Re: Dynamic multidimensional array, deallocation of pointer not malloced..
<welch.ryan@gmail.com> wrote in message
news:1178928147.269919.77720@q75g2000hsh.googlegroups.com...
Hi all,
Having a problem with addressing large amounts of memory. I have a
simple piece of code here that is meant to allocate a large piece of
memory on a ppc64 machine. The code is:
/*
Test to see what happens when we try to allocate a massively huge
piece of memory.
*/
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
int main(int argc, char** argv) {
cout << "Attemping to allocate.." << endl;
const int ROWS = 635000;
const int COLS = 2350;
// Allocate.
try {
int** test = new int*[ROWS];
for (int i = 0; i < ROWS; i++) {
test[i] = new int[COLS];
for (int j = 0; j < COLS; j++) {
test[i][j] = 0;
}
}
How long does it take for your code to run? I'm asking this because the
code you posted seems very inefficient.
You are invoking "new[]" 635,000 times. An alternative is to make only two
calls to "new[]". One new[] for the row pointers, and the second new[] to
allocate the pool of memory for the int data. Then in the loop, you point
the row pointers in the right place in the int data pool.
Not only will this more than likely bypass your problem with the allocator,
your code would more than likely see a significant increase in speed, both
in allocation and in deallocation (at least in this area of code). However,
you should test this (but I would be very surprised if there isn't a
significant speed increase)
Here are the internals of your code snippet rewritten making only two calls
new[] and then two calls to delete[] to deallocate the memory.
int *pool;
int** test = new int*[ROWS]; // allocate for row pointers
pool = new int [ROWS * COLS]; // allocate memory pool for data
for (int i = 0; i < ROWS; i++)
{
test[i] = pool;
pool += COLS;
}
// Deallocate.
delete [] test[0]; // deallocate pool
delete [] test; // deallocate row pointers.
- Paul