Как правильно удалить char**

У меня есть char**, в основном массив строк, которые мне нужно удалить. Каков правильный способ сделать это, чтобы все указатели были очищены?

6 ответов


char** StringList ;
int nStrings ;
....
for (int i = 0 ; i < nStrings ; i++)
  delete[] StringList[i] ;
delete[] StringList ;

конечно, проще, если вы начнете с

std::vector<std::string> Stringlist ;

тогда это просто

StringList.clear() ;

основное правило заключается в том, что вам нужен delete (или delete[]) для каждого new (или new[]), что вам выдали.

если ты:

char **pp = new char*[N];
for (i = 0; i < N; i++)
{
    pp[i] = new char[L];
}

тогда вам нужно будет очистить с:

for (i = 0; i < N; i++)
{
    delete [] pp[i];
}
delete [] pp;

однако следует отметить, что, поскольку вы находитесь в C++, вы, вероятно, должны использовать std::vector<std::string> вместо массивов массивов raw char, потому что он будет управлять своей собственной очисткой.


сделать по шаблону, как описано ниже :

char *arr = new char[10];
char *p = new char;

delete [] arr;
delete p;

вы видели шаблон, когда использовать что?

Итак, теперь перейдите к исходному вопросу:

char **dp = new char*[100]; //100 number of `char*`
for ( int i = 0  ; i < 100 ; i++ ) //loop for 100 times
    dp[i] = new char[30];  //allocate memory for each `char*`

 //deallocate
 for ( int i = 0  ; i < 100 ; i++ ) 
    delete [] dp[i]; //deallocate memory for each `char*`
 delete [] dp; //deallocate memory for `char**`

for(int i = 0; i < array_length; ++i)
{
    delete[] array[i]; // delete each entry in the array (assuming you used new[] for each string)
}

delete[] array; // delete the actual array.

Я предполагаю, что у вас есть массив, как это:

char **pp = new char* [10];  // for the base pointer
for(int i = 0; i < 10; i++)
  pp[i] = new char[100]; // for every char* string

вы должны следовать обратному порядку. Сначала очистите строки-члены,а затем главный указатель.

for(int i = 0; i < 10; i++)
  delete[] pp[i];
delete[] pp;

for (int i = rows; i > 0; --i) {
 delete[] anArray[i-1];
}
delete[] anArray;