C++ 在C+中检测到堆损坏+;在复制[]数组后删除它
我试图创建一个方法来创建一种动态数组:当索引超过时,它会创建另一个包含一个元素的数组,然后删除旧数组,并复制旧数组中新数组的指针。但当我删除旧数组时,检测到堆损坏,程序冻结<代码>状态是旧数组(包含10项)C++ 在C+中检测到堆损坏+;在复制[]数组后删除它,c++,arrays,pointers,heap,heap-corruption,C++,Arrays,Pointers,Heap,Heap Corruption,我试图创建一个方法来创建一种动态数组:当索引超过时,它会创建另一个包含一个元素的数组,然后删除旧数组,并复制旧数组中新数组的指针。但当我删除旧数组时,检测到堆损坏,程序冻结状态是旧数组(包含10项)初始化索引用于跟踪数组长度 if (states == nullptr) states = new int[10]; if (initializationIndex > 10) { int *tempArr = new int[initializationIndex];
初始化索引
用于跟踪数组长度
if (states == nullptr)
states = new int[10];
if (initializationIndex > 10) {
int *tempArr = new int[initializationIndex];
arrayCpy(states, tempArr, initializationIndex - 1);
delete[] states; // HEAP CORRUPTION DETECTED
states = tempArr;
}
if (arrayContains(initializationIndex, states, stateToInsert))
return false;
states[initializationIndex] = stateToInsert;
initializationIndex++;
函数ArrayCopy:
void arrayCpy(int * src, int * dst, int offset)
{
int i = 0;
for (i = 0; i < offset; i++) {
dst[i] = src[i];
}
}
void arrayCpy(int*src、int*dst、int offset)
{
int i=0;
对于(i=0;i
您编辑了问题
if (states == nullptr)
states = new int[10];
if (initializationIndex > 10) {
int *tempArr = new int[initializationIndex];
arrayCpy(states, tempArr, initializationIndex - 1);
delete[] states; // HEAP CORRUPTION DETECTED
states = tempArr;
}
假设initializationIndex=15,您正在为14个元素执行复制,而状态大小仅为10
delete[] tempArr; // HEAP CORRUPTION DETECTED
states = tempArr;
您可以删除该数组,然后使用它
正如人们在评论中所说,使用std::vector,无需进行新建/删除 使用
std::vector
。为什么要删除tempArr
?您是否应该删除状态
?这需要一个。如果初始化索引
大于10-您读取的值超出了状态
数组的范围。@GiovanniBertoncelli:正是为了这些“误解”,您应该提供上述MCVE!你不应该在这里问,除非在讲座中提到这些课程(通常是最后几堂课),否则不需要新建/删除<我认为学生学习C++是很不好的,但把它当作C语言是因为大纲太老了,没有人愿意更新它。“实际上,这是我的问题:我刚开始学习这门语言,我用它就像C,因为我不知道它的潜力。”阿卡迪高德林说,这不是真正的教学大纲,而是一个禁止的概念。使用未描述的功能。它源于统一教育过程的官僚方法。@Arkady Godlin它与基础学科很好地结合,甚至在我们的国家(俄罗斯?乌克兰?白俄罗斯?显然,甚至法国都是这样),因为“学科不同”而不这样做的概念不会产生,因为每一个推纸工都会把它射下来。他们真正需要的是在付诸实践之前有一个广泛的理论部分,但所有实践都需要同时结合实践和理论。接受学生在课程之外完成的工作对那些还没有学习这些功能的学生来说是“不公平的”。也就是说,从形式的角度来看。