Большой массив удаления указателей

0

У меня есть большой массив указателей вроде:

int *m_Data[1000];

Во время разрушения, должен ли я всегда идти на элемент мудро или есть лучший способ?

for(int i = 0; i<1000; i++)
  delete m_Data[i];
Теги:
arrays
pointers
delete-operator

3 ответа

3
int *m_Data[1000];

представляет собой массив из 1000 указателей на int с автоматическим временем хранения.

Вам нужно вызвать delete для каждого new и delete[] для каждого new[], то есть:

for(int i = 0; i<1000; i++)
    delete m_Data[i];

является правильным, только если вы ранее делали что-то вроде:

for(int i = 0; i<1000; i++)
    m_Data[i] = new int;

"Есть ли лучший способ?" - Да:

std::vector<int> m_data(1000);

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

  • 0
    Я динамически размещаю в конструкторе новые для каждого элемента.
  • 0
    Если я использую вектор, как вы сказали, я должен также удалить в деструкторе? или он будет автоматически удален?
Показать ещё 2 комментария
3

Вы можете использовать интеллектуальный указатель (например, std::unique_ptr) вместо необработанных указателей и не беспокоиться о ручном удалении:

std::unique_ptr<int> m_Data[1000];
0

Может быть, вы можете сделать что-то вроде:

int* m_Data = new int[1000];

// ...

delete [] m_Data;

Или:

int m_Data[1000]; // Why to allocate each element dynamically ?

В этом случае вам не нужно удалять какой-либо элемент.

Но если вам нужно динамически выделять каждый элемент один за другим:

int *m_Data[1000];
for( int i = 0; i < 1000; i++ )
    m_Data[i] = new int;

// ...

for( int i = 0; i < 1000; i++ )
    delete m_Data[i];  // To need to deallocate each element.

Почему бы вам не использовать контейнер типа std::vector?

std::vector<int> m_Data(1000);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню