调整动态数组大小后可能出现的问题

时间:2010-11-29 14:25:48

标签: c++ memory-management

这里没什么问题。

我创建了动态数组:

   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 个答案:

答案 0 :(得分:4)

您应该使用std::vector,然后您可以new为新struct分配内存并将其指针推送到向量,如果删除则应该删除指针。

答案 1 :(得分:1)

试试这个:

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

除非绝对必要,否则不要走人工管理阵列的路线 - std::vector会做得更好,经过大量C ++程序员的更好测试,验证,标准化和理解。请参阅我的代码示例 - 甚至不是单个newdelete语句,但此代码还包含所有必需的内存管理。

P.S。:由于这个问题被标记为C ++,因此只要struct element用作类型,就不必编写element,只需{{1}}即可。这表明你来自C,所以我的建议是:在继续你正在做的事情之前了解STL,花一个小时学习如何使用标准容器类可以节省你多天的手动调整,调试和错误修复。特别是因为一旦你学会了一个,你已经知道80%的其他所有人。 :)

答案 2 :(得分:0)

m_elements[i] = new struct element[m_element_size];

这会创建一个大小为element

m_element_size数组

要动态创建结构,只需使用new struct elementnew 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);

答案 3 :(得分: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());