I have allocated and array of Objects
Objects *array = new Objects[N];
How should I delete this array? Just
delete[] array;
or with iterating over the array's elements?
for(int i=0;i<N;i++)
delete array[i];
delete[];
Thanks
UPDATE:
I changed loop body as
delete &array[i];
to force the code to 开发者_运维问答compile.
Every use of new
should be balanced by a delete
, and every use of new[]
should be balanced by delete[]
.
for(int i=0;i<N;i++)
delete array[i];
delete[] array;
That would be appropriate only if you initialized the array as:
Objects **array = new Objects*[N];
for (int i = 0; i < N; i++) {
array[i] = new Object;
}
The fact that your original code gave you a compilation error is a strong hint that you're doing something wrong.
BTW, obligatory: avoid allocating arrays with new[]
; use std::vector
instead, and then its destructor will take care of cleanup for you. Additionally it will be exception-safe by not leaking memory if exceptions are thrown.
Just delete[] array
is sufficient. It is guaranteed that each element of the array is deleted when you delete an array using delete[]
operator.
As a general rule you should delete
/delete[]
exactly those things that you allocated with new
/new[]
. In this case you have one allocation with new[]
, so you should use one call to delete[]
to free that allocated thing again.
That the delete
s in the for-loop won't compile is also a good indication that they are not the right way to do it.
Not only is
delete [] array;
enough, but if you do
for(int i=0;i<N;i++)
delete &array[i];
delete[] array;
you'll be causing undefined behavior, because
delete &array[i];
will be deleting things that weren't returned by a new
operation.
Not to mention that the subsequent delete[] array;
will call the destructor for all the objects that just had destructors called in the loop.
So don't do that.
delete [] array
is enough.
精彩评论