我有一个调用的函数插入我给它我想进入我有理解为什么会没有输入数据的问题数组的值。我收到错误消息,检测到堆损坏,CRT检测到应用程序在堆缓冲区结束后将其写入内存。
void darray::insert(value_type entry) {
if (numberOfItems == 0) {
data = new value_type[numberOfItems];
}
data[numberOfItems] = entry;
numberOfItems++;
value_type* temp = new value_type[numberOfItems + 1];
for (int i = 0; i < numberOfItems; i++) {
temp[i] = data[i];
}
delete[] data;
data = temp;
}
numberOfItems跟踪数组中使用的项目数。每次将新元素输入数组时,它应增加一个。
你的实现是在错误的顺序做的事情。它是在将新项目插入数组之前为其增加数组以为其腾出空间。它看起来应该更像这样:
void darray::insert(value_type entry)
{
value_type* temp = new value_type[numberOfItems + 1];
for (int i = 0; i < numberOfItems; i++) {
temp[i] = data[i];
}
temp[numberOfItems] = entry;
delete[] data;
data = temp;
++numberOfItems;
}
if (numberOfItems == 0) {
data = new value_type[numberOfItems];
}
嗯。多少个项目再次分配?然后我们到达这里:
data[numberOfItems] = entry;
我会假设你想将这个项目到新分配的缓冲区?即这一个:
value_type* temp = new value_type[numberOfItems + 1];
通常是最典型的std :: vector之类的实现,将使用global new和new位置来构造数组。遵循以下原则:
auto ptr = (value_type*)::operator new(++numberOfItems * sizeof(value_type));
for(size_t i = 0; i < numberOfItems; ++i)
{
new (ptr + i) value_type(data[i]);
}
for(size_t i = 0; i < numberOfItems - 1; ++i)
{
data[i].~value_type();
}
::operator delete (data);