Удаление динамически размещенного зубчатого массива - PullRequest
0 голосов
/ 12 января 2011

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

Компилируется нормально;предупреждений нет.Работает нормально;и закрывается нормально;По крайней мере, пока я не введу закомментированный оператор удаления в деструкторе.

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

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 или другие шаблоны, это просто потому, что я заинтересован в изучении этого.Максимальная критика приветствуется.

Ответы [ 2 ]

3 голосов
/ 12 января 2011

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

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

1 голос
/ 12 января 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...