Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+中检测到堆损坏+;在复制[]数组后删除它_C++_Arrays_Pointers_Heap_Heap Corruption - Fatal编程技术网

C++ 在C+中检测到堆损坏+;在复制[]数组后删除它

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

我试图创建一个方法来创建一种动态数组:当索引超过时,它会创建另一个包含一个元素的数组,然后删除旧数组,并复制旧数组中新数组的指针。但当我删除旧数组时,检测到堆损坏,程序冻结<代码>状态是旧数组(包含10项)
初始化索引
用于跟踪数组长度

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它与基础学科很好地结合,甚至在我们的国家(俄罗斯?乌克兰?白俄罗斯?显然,甚至法国都是这样),因为“学科不同”而不这样做的概念不会产生,因为每一个推纸工都会把它射下来。他们真正需要的是在付诸实践之前有一个广泛的理论部分,但所有实践都需要同时结合实践和理论。接受学生在课程之外完成的工作对那些还没有学习这些功能的学生来说是“不公平的”。也就是说,从形式的角度来看。