在普通块(#164)之后检测到堆损坏
Heap Corruption Detected after normal block (#164)
最近,我一直在尝试了解动态编程的基础知识,现在我正面临着堆腐败的一些问题。当我尝试释放内存时,我的代码断开。我已经在互联网上进行了一些研究,发现我收到了此消息,因为我在一些未分配的内存空间中写了这一消息。但是,我仍然不知道错误在哪里或如何解决。
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <fstream>
std::ifstream f("file.in");
void read(int *a, int &n)
{
f >> n;///scanf("%d", &n);
int i;
for (i = 0; i < n; i++)
f >> a[i];/// scanf_s("%d", &a[i]);
}
int main()
{
int *a, *b, *c;
int na = 0, nb = 0;
int i = 0, j = 0, k = 0, kk = 1, p;
a = (int*)malloc(na*sizeof(int));
b = (int*)malloc(nb*sizeof(int));
c = (int*)malloc(kk * sizeof(int));
read(a, na);
read(b, nb);
while (i < na && j < nb)
{
if (a[i] < b[j])
{
kk++;
c = (int*)realloc(c, kk * sizeof(int));
c[k] = a[i];
k++;
i++;
}
else
{
kk++;
c = (int*)realloc(c, kk * sizeof(int));
c[k] = b[j];
k++;
j++;
}
}
if (i < na)
for (p = i; p < na; p++)
{
kk++;
c = (int*)realloc(c, kk*sizeof(int));
c[k++] = a[p];
}
if (j < nb)
for (p = j; p < nb; p++)
{
kk++;
c = (int*)realloc(c, kk *sizeof(int));
c[k++] = b[p];
}
for (i = 0; i < k; i++)
printf("%d ", c[i]);
free(a);
free(b);
free(c);
}
int na = 0;
int *a = (int*)malloc(na*sizeof(int));
read(a, na);
这是问题。您可以创建一个大小为0的缓冲区,然后在"中写入"。仅当您弄清楚大小后,才必须创建缓冲区。重新排列代码以使该行有意义:
int na = 0;
int *a = read(na);
或更高:
std::vector<int> a = read();
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 使用CMake检测支持的C++标准
- 在类定义之后定义一个私有方法
- 当套接字连接断开时检测C/C++Unix
- 在循环C++中指定字符串之后,不会打印该字符串
- C/C++预处理器是否可以检测一些编译器选项
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- 在普通块(#164)之后检测到堆损坏
- 检测到堆损坏:在正常块(#62)之后
- 用于在检测到正方形之后运行命令的c++算法
- 检测到堆损坏:在正常块(#126)之后
- 检测到堆损坏:在正常块 () 之后
- 在 sscanf() 之后调用 free() 时检测到堆损坏
- 在删除行的正常块之后检测到堆损坏
- ***检测到glibc***..:free():无效的下一个大小(正常):..***fclose();之后;
- 在正常块之后检测到堆损坏(#181)
- 堆损坏检测:在正常块之后(#153)
- 在正常块之后检测到堆损坏(#174)
- 在0x00DB4E70检测到堆损坏:在正常块(#151)之后
- gtest 仅在该方法在 .h 中实现时检测方法,而不是在 .cpp 中实现(cMake;问题发生在"make"之后)