2011-01-12 6 views
0

У меня есть массив указателей, указывающих на массивы ints. Я сделал жестко закодированный массив ints (проверьте «массив» ниже), и я хочу вставить его в массив указателей (отметьте «bar» ниже), насколько я могу судить, это все еще массив указателей это указывает на массивы ints.Удаление динамически выделенного зубчатого массива

Он компилируется в порядке; никаких предупреждений. Он работает нормально; и закрывает штраф; До тех пор, пока, по крайней мере, я введу текущую прокомментированную инструкцию delete в деструкторе.

Я полагаю, что мой компилятор на данный момент станет лучшим деструктором, но мне интересно, что я делаю неправильно. Терминальное окно просто выбрасывает гигантскую карту памяти; и googling и поиск SO не очень помогли.

class foo { 
    public: 
    int **bar; 
    int aSize; 

    //CONSTRUCTOR 
    foo(int aSize) { 
     this->aSize = aSize; 
     bar = new int*[aSize]; 
     for (int i=0;i<aSize;i++) { 
      bar[i] = new int[aSize + i]; 
      for (int j=0;j<(aSize + i);j++) { 
       bar[i][j] = 0; 
      } 
     } 
     } 
    void myfunc(int *pointer) { 
     bar[0] = pointer; 
    } 
    ~foo() { 
     for (int i=0;i<aSize;i++) { 
      //delete[] bar[i]; 
     } 
     delete[] bar; 
    } 
}; 
int main() { 
    foo *obj = new foo(5); 

    int array[] = {1,2,3,4}; 

    obj->myfunc(array); 

    delete obj; 
    return 0; 
}; 

Я знаю, что я, вероятно, сделал что-то трагическое; Я просто не знаю, что это такое. Существует причина, по которой я не использую STL или другие шаблоны, это просто потому, что я заинтересован в этом. Максимальная критика оценили.

ответ

3

Функция myfunc принимает указатель, а затем устанавливает bar[0] на этот адрес памяти. В вашем примере кода вы передаете ему адрес array, который является автоматической (стек) переменной. Затем деструктор пытается установить delete[] bar[0], что указывает на переменную стека . Это полностью undefined behavior, и причина, по которой ваша программа рушится. Вы не можете создать массив стека delete[]. Вы можете только delete[] массив, который был выделен с помощью new[].

Кроме того, функция myfunc всегда будет утечка памяти, потому что bar[0] указывает на массив, выделенный для кучи. Когда вы устанавливаете bar на другой адрес памяти без первого delete[] предыдущего адреса, вы пропускаете память.

+0

Право, дерьмо, очевидный ответ ... проклятая жаркая погода. Благодарю. Изменение int i = 0 до i = 1 фиксировало его. – dcousens

+2

Горячая погода? [Я завидую вам.] (Http://www.weather.com/weather/today/New+York+NY+USNY0996?from=search_city «Я вам завидую».) –

+0

Вы можете только «удалить []' массив выделяется с помощью 'new []', а не 'new'. Незначительная нитьчка. – Puppy

1

Проблема заключается в вызове myfunc. В этой функции вы заменяете указатель (bar[0]), который ваш класс считает своим владельцем. Затем ваш денструктор obj попытается запустить delete[] на вашем array[] в main, что, вероятно, приводит к вашему сбою и оставляет ваш исходный bar[0] болтается.

Смежные вопросы