возможные проблемы после изменения размера динамического массива - PullRequest
0 голосов
/ 29 ноября 2010

У меня небольшая проблема.

Я создал динамический массив:

   m_elements  = new struct element*[m_number_of_elements];
   for(int i = 0; i < m_number_of_elements; i++)
   {
       m_elements[i] = new struct element[m_element_size];
   }

, затем попытался изменить размер существующего массива:

   m_elements[m_number_of_elements] = create_more_elements();
   m_number_of_elements++;

create_more_elements ()функция:

   struct index* create_more_elements()
   {
        struct element* tmp = new struct element[m_number_of_elements]
        return tmp;
   }

В общем, этот кусок кода работает, но иногда я получаю ошибки в разных местах.Связаны ли сегфо с изменением размера?Есть мысли?

Ответы [ 4 ]

4 голосов
/ 29 ноября 2010

Вы должны использовать std::vector для этого, затем вы можете с помощью new выделить память для нового struct и переместить ее указатель на вектор, если вы удаляете, вы должны удалить по указателю.

1 голос
/ 29 ноября 2010

Попробуйте это:

std::vector<element> m_elements;
m_elements.resize(m_number_of_elements);

Не идите путем ручного управления массивом без крайней необходимости - std::vector сделает намного лучшую работу, лучше протестирован, проверен, стандартизирован и понят легионерами C ++. Посмотрите мой пример кода - даже не один оператор new или delete, но этот код также содержит все необходимое управление памятью.

P.S .: Поскольку этот вопрос помечен как C ++, вам не нужно писать struct element, где бы вы ни использовали его в качестве типа, достаточно просто element. Это говорит о том, что вы пришли из C, поэтому мой совет: узнайте о STL , прежде чем продолжить, что вы делаете, один час, потраченный на изучение использования стандартных контейнерных классов, может сэкономить вам много дней ручного настройка, отладка и исправление ошибок. Тем более, что, узнав один, вы уже знаете, как 80%, обо всех остальных. :)

0 голосов
/ 29 ноября 2010

Удивительно, что ваш код даже работает.В основном то, что вы делаете, это перезаписывает память после вашего первоначально выделенного массива.В C ++ вы не можете изменить размер массива, вы можете только удалить его и создать новый.

element** tmp = new element*[m_number_of_elements];
for(int i = 0; i < m_number_of_elements; i++)
{
    tmp[i] = m_elements[i]
}
delete m_elements;
m_elements = tmp;

m_elements[m_number_of_elements] = create_more_elements();    
m_number_of_elements++;

Но это действительно сложно.Как указывает Svisstack, вы должны использовать std :: vector или любой другой подходящий стандартный контейнер.

std::vector<element*> m_elements;

// ...

m_elements.push_back(create_more_elements());
0 голосов
/ 29 ноября 2010
m_elements[i] = new struct element[m_element_size];

Это создает массив размером element m_element_size

Чтобы динамически создать структуру, просто используйте new struct element или new element.

Если вам не нужно инициализировать значения в вашем массиве, вам может быть даже лучше не хранить указатели, а реальные объекты в вашем массиве:

m_elements = new element[m_number_of_elements];

Чтобы «изменить размер» массива, вам фактически нужно выделить новый больший массив, скопировать содержимое текущего массива в новый и удалить старый массив.

// Allocate new array
element* newArray = new element[m_number_of_elements + 1];
// Copy old array content into new one
memcpy(newArray, m_elements, m_number_of_elements * sizeof(element)];
// Delete old array
delete[] m_elements;
// Assign new array
m_elements = newArray;
// Keep new size
m_number_of_elements += 1;

Но вам определенно следует использовать std :: vector , который проще и умнее этого:

std::vector<element> elements;

// Add an element
Element element;
...
elements.push_back(element);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...