2010-11-29 2 views
0

У вас здесь небольшая проблема.Возможные проблемы после изменения размера динамического массива

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

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; 
    } 

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

ответ

4

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

+0

Я согласен с вами, но у меня около 1000 строк кода, и я надеюсь не менять все))). – qutron 2010-11-29 14:50:32

0
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); 
1

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

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

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

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

0

Удивительно, что вы код даже работает. В основном то, что вы делаете, перезаписывает память после вашего первоначально выделенного массива. В 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()); 
Смежные вопросы