Hi everyone,

I've been working with pointers for quite some time and I'm familiar with all the pointer-reference stuff. One of the things I don't get is the function of the delete keyword.

I have used this code to find out what the delete keyword does.

int main(int argc, char *argv[]) {
    int *i;
    if (i) cout << i << ": " << *i << endl;
    
    i = new int(6);
    if (i) cout << i << ": " << *i << endl;
    
    delete i;
    if (i) cout << i << ": " << *i << endl;
    
    i = new int(8);
    if (i) cout << i << ": " << *i << endl;
    
    delete i;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

This gave me this output:

[Address1]: -xxxxxxxx
[Address2]: 6
[Address2]: xxxxxxx
[Address2]: 8

So I'm confused with this output. Does the if (i) statement tell me that the pointer has been initialized, or does it always return true? How do I detect whether the address points to a valid location? (As in, no gigantic positive or negative numbers.) Why doesn't the address change when I call delete and call new again?

Help will be much appreciated.

right, there are some fundamental problems here:

int main(int argc, char *argv[]) {
    int *i; // pointer un-initialised - some random value in here

// because i points to a random memory address the de-referencing will most likely
// cause an unhandled exception on the print-out
// if you're lucky and the memory i points to belongs to your process then the below
// statement will print some garbage
    if (i) cout << i << ": " << *i << endl;
   
// now you're cooking with water: you create a new int on the heap and initialise
// it with the value 6 and assign its address on the heap to your pointer i 
    i = new int(6);
    if (i) cout << i << ": " << *i << endl;
    
// now you call the destructor on what i is pointing to which destructs the 
// integer you created above and frees the memory for re-use. it does *NOT*
// reset the value of i to NULL 
    delete i;

// because your i is not NULL the following print will be executed, but what i points
// to was destructed above and the memory freed so you are getting garbage for *i
    if (i) cout << i << ": " << *i << endl;
    
// good again
    i = new int(8);
    if (i) cout << i << ": " << *i << endl;

// final destruct - also good
    delete i;
    
    system("PAUSE");
    return EXIT_SUCCESS;
}

Thanks for the advice, drkybelk.

I'm not saying this is the actual program, this is just the program I'm using to tell me what goes on within the computer when I use pointers and such.
I also know the basic good-to-know stuff, like initializing pointers and destructing them.

So to answer my own questions:
1) The if (i) statement will return false ONLY if i == NULL.
2) The address always points to a valid location, except if it is NULL. What's at that location is a different matter altogether. A usable location would be decided when calling 'new'.
3) The address doesn't change because I didn't set i to NULL.

Anything needs correcting?

1) -correct-
2) -incorrect-: if you do not initialise the pointer then it points to a *RANDOM* address, which means it might be valid or not, might also be NULL
3) -correct-

If I can add something to this, here's a lecture by David J. Malan teaching computer science at Harvard explaining pointers and dynamic memory allocation, and here he explains heaps if you want to further understand what's going on.