Деструктор для примитивного типа динамически размещаемого массива? - PullRequest
1 голос
/ 07 февраля 2012

Если я хочу удалить динамически распределяемый массив значений примитивного типа:

int *it = new int[10]

я просто помещаю delete [] it в деструктор, чтобы правильно освободить память?

ИЛИ

Понимание того, что, поскольку указатель является примитивным типом, для удаления динамически размещенного массива необходимо выполнить нечто подобное в деструкторе:

for (size_t idx = 0; idx != 5; ++idx)
        delete sp[idx];
    delete[] sp;

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

Ответы [ 2 ]

5 голосов
/ 07 февраля 2012

Если у вас есть:

int* it = new int[10];

правильный путь к delete, это:

delete[] it;

Если у вас есть переменная-член этого типа, вам нужно реализовать копиюКонструктор и оператор присваивания в качестве их версий по умолчанию недостаточны или делают класс недоступным для копирования.

Поскольку это C ++, я бы предложил вместо этого использовать std::vector<int>, поскольку это будет обрабатывать управление памятью для вас.

2 голосов
/ 07 февраля 2012

Если вы собираетесь использовать new и delete, то следует придерживаться общего правила: используйте ровно столько delete с, сколько вы сделали new с.

В вашем случаеВы вызвали new[] только один раз.Вы должны * inovke delete[] только один раз.

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

Iскажите «Если вы собираетесь использовать new и delete», потому что вы часто не должны.Используя методы RAII и стандартные контейнеры, вполне возможно написать совершенно полезные программы, которые никогда напрямую не вызывают new или delete.

Если вы пытаетесь поддерживать массив int s, используйтеstd::vector:

class MyClass {
    std::vector<int> it;

    void SomeFun() { it.resize(10); }
};

Затем в вашем деструкторе ничего не делать .Векторы исчезают без вашей помощи.

...