c++ - 检测到合并排序堆损坏

标签 c++ merge heap-memory mergesort heap-corruption

我正在编写一个函数,该函数应该使用合并排序对数组进行排序。到目前为止,我有两个功能:

template <typename Item, typename SizeType>
void merge_sort(Item data[], SizeType size) {
SizeType size1, size2;
if(size > 1) {
    size1 = size/2;
    size2 = size - size1;
    merge_sort(data,size1);
    merge_sort((data+size1),size2);

    merge(data,size1,size2);
}
}

和:

template <typename Item, typename SizeType>
void merge(Item data[], SizeType size1, SizeType size2) {
Item* temp;
SizeType copied = 0;
SizeType copied1 = 0;
SizeType copied2 = 0;

temp = new Item[size1 + size2];

while(copied1 < size1 && copied2 < size2) {
    if(data[copied1] < (data + size1)[copied2])
        temp[++copied] = data[++copied1];
    else
        temp[++copied] = (data + size1)[++copied2];
}

while (copied1 < size1)
    temp[++copied] = data[++copied1];
while (copied2 < size2)
    temp[++copied] = (data + size1)[++copied2];

for(SizeType i = 0; i < size1 + size2; ++i)
    data[i] = temp[i];
delete [] temp;
}

但是,当我尝试运行该程序时,出现调试错误,指出堆在正常 block 后损坏,并且 CRT 检测到应用程序在堆缓冲区结束后写入内存。谁能解释这意味着什么以及我该如何解决?

最佳答案

你在使用值之前递增......所以这基本上使检查过时......

改用copied++

您需要后自增运算符,因为如果在使用它之前自增它,就会越界。 <强> Increment and decrement operators

关于c++ - 检测到合并排序堆损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13751096/

相关文章:

c++ - C++对象有类的静态方法吗?

git - 如何 merge 来自另一个分支的单个提交而不产生副作用(又名不使用cherry-pick)?

r - 在 R 中合并数据帧的问题

c# - 优雅的解决方案 - 使用 Linq-To-SQL 批量删除和重新添加相关的子列表

c++ - 堆数据困惑

c++ - 如何重载具有多个参数的运算符,如 a + b + c?

c++ - 列出数组未转换为指向单个元素的指针的所有情况?

java - 最终变量是否在每个实例的基础上占用内存?

c++ - C++ 标准第 3.4.3.1 节中此语句的示例?

c++ - 不删除动态分配的内存,并在程序终止后让操作系统释放它