2015-04-05 2 views
0

У меня проблема с двумерным динамически распределенным массивом, который я использую в своем коде. Все работает нормально, пока моя программа не попытается вызвать деструктор моего объекта tablica2D. Я получаю ошибку времени выполнения «HEAP CORRUPTION DETECTED», когда моя программа доходит до последней команды delete[] tab. Означает ли это, что цикл, предшествующий ему, уже освобождает всю память, назначенную tab? У меня создалось впечатление, что для освобождения всей динамически назначенной памяти должна быть одна команда delete для каждой команды new. Или что-то еще вызывает эту ошибку?C++ Удаление двумерного динамически выделенного массива

Вот код класса, который вызывает у меня проблемы:

class tablica2D 
{ 
    static const int k = 2; 
    int n, m; 
    string **tab; 
public: 
    tablica2D(int n, int m) 
    { 
     this->n = n; 
     this->m = m; 

     tab = new string*[n]; 
     for (int i = 0; i < m; i++) 
     { 
      tab[i] = new string[m]; 
     } 
    } 
    string* operator [](int n) 
    { 
     return tab[n]; 
    } 
    static const bool compareRows(const string* i, const string* j) 
    { 
     int x = atoi(i[k].c_str()); 
     int y = atoi(j[k].c_str()); 
     return x > y; 
    } 
    void sort() 
    { 
     std::sort(tab, tab + n, compareRows); 
    } 
    ~tablica2D() 
    { 
     for (int i = 0; i < n; i++) 
     { 
      delete[] tab[i]; 
     } 
     delete[] tab; 
    } 
}; 
+1

Есть ли причина, по которой вы не используете ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector)? –

+1

Почему для небес? s ради вы боретесь с управлением памятью самостоятельно, где все это прекрасно доступно с [стандартными контейнерами C++] (http://en.cppreference.com/w/cpp/container) и [динамическим управление памятью] (http://en.cppreference.com/w/cpp/memory)? –

+0

@ πάνταῥεῖ Возможно, это задание. –

ответ

2

Вы используете неправильные переменные в вашем new цикла, и, кроме того, создавая 3D-массив вместо 2d массива:

for (int i = 0; i < m; i++) 
    //     ^^, should be n 
    { 
     tab[i] = new string[m]; 
     //     ^^^ 
     // should be new string, not new string[m] 
    } 

против:

for (int i = 0; i < n; i++) 
    //     ^^, this one is correct 
    { 
     delete[] tab[i]; 
    } 
+0

Разве это не 'n' вместо' m'? – user7

+0

На самом деле это также должно быть n в первом цикле, но после этого изменения все работает. Я пропустил это, потому что я использовал m> n в своих тестах, поэтому у моего массива были дополнительные пустые строки, но я мог поместить все, что я пытался вставить. Спасибо за быстрый ответ. – Kurigalzu

+0

@ Kurigalzu Даже с этим изменением ваш класс 'tablica2D' легко разбивается на две линии main(). '{tablica2D t1 (10, 10); tablica2D t2 = t1; } 'Вам не удалось реализовать правило 3 из вашего класса. – PaulMcKenzie

0

Если мне нужен C-подобный 2D массив я всегда использую:

type **myarr = new type*[X]; 
myarr[0] = new type[X*Y]; 
for (int i = 1; i < X; i++) { 
    myarr[i] = myarr[0] + i * Y; 
} 

Для использования:

myarr[x][y] 

Тогда для освобождения:

delete[] myarr[0]; 
delete[] myarr; 

То же, с некоторым небольшим усилием, может быть применен для N-мерного массива.