在C ++中删除已分配的内存时出错

时间:2011-04-28 04:05:22

标签: c++ pointers memory-management

我是C ++的新手,我正在尝试了解解除分配数组内存的正确方法。尝试删除已分配的指针数组时,我收到以下错误: “没有分配被释放的指针。”

我的指针定义为:

T * al ;
al = new T[top] ;

虽然我的定义指针al的类的析构函数是:

for( int i = 0 ; i < current ; i++ )
        delete( al+i ) ;
    delete [] al ;

class T的析构函数是:

for( int i = 0 ; i < length ; i++ )
        delete( p+1 ) ;
delete [] p ;

p定义为:

char *p ;
length = strlen( str ) ;
p = new char[length] ;
strcpy( p, str ) ;

如何正确分配内存和/或如何解决此问题?

2 个答案:

答案 0 :(得分:2)

只需使用delete [],而不是循环使用。 delete []将删除数组的每个元素。

此外,类T析构函数中的循环正在尝试删除p+1而不是p+i

答案 1 :(得分:0)

具体来说,你应该delete这样:

int *a = new int; // One allocated
delete a;         // So delete one

int *b = new int[50]; // 50 allocated
delete[] b;           // Just use delete[], don't delete every one

int **c = new int*[50]; // 50 pointers to ints
for (int i = 0; i < 50; i++)
    c[i] = new int;     // each c[i] points to a pointer to a new int

for (int i = 0; i < 50; i++)
    delete c[i];
delete[] c;

使用delete时使用newdelete[]时使用new[]


执行以下操作实际上是错误的:

int *a = new int[50];

// do stuff...

for (int i = 0; i < 50; i++)
   delete &a[i]; // equivalent to delete (a + i);
delete[] a;

您只执行delete[] a,而不是delete (a + i)