这里没什么问题。
我创建了动态数组:
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;
}
一般来说,这段代码有效,但有时我会在不同的地方出现段错误。 段错误是否与调整大小有关? 有什么想法吗?
答案 0 :(得分:4)
您应该使用std::vector
,然后您可以new
为新struct
分配内存并将其指针推送到向量,如果删除则应该删除指针。
答案 1 :(得分:1)
试试这个:
std::vector<element> m_elements;
m_elements.resize(m_number_of_elements);
除非绝对必要,否则不要走人工管理阵列的路线 - std::vector
会做得更好,经过大量C ++程序员的更好测试,验证,标准化和理解。请参阅我的代码示例 - 甚至不是单个new
或delete
语句,但此代码还包含所有必需的内存管理。
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 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);
答案 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());