使用calloc在内存分配期间出错(释放后在YYY修改的免费堆块XXX)

时间:2015-04-09 15:52:24

标签: c++ visual-c++ memory memory-management

我需要一系列unsigned long long类型的缓冲区,这些是我在分配时使用的代码行。

FAC_op_Buffer = static_cast<uint_64 *>( calloc(static_cast<uint_32>(ceil(static_cast<float>(2*FAC_N) / 64.0) ), sizeof(uint_64)) );
SDC_op_Buffer = static_cast<uint_64 *>( calloc(static_cast<uint_32>(ceil(static_cast<float>(2*SDC_n) / 64.0) ), sizeof(uint_64)) );

MSC_coder_h_lvl_1 = static_cast<uint_64 *>( calloc( static_cast<uint_32>(ceil(static_cast<float>(2*(MSC_n1_n2[0] + MSC_n1_n2[1])) / 64.0) ), sizeof(uint_64) ) );
MSC_coder_h_lvl_2 = static_cast<uint_64 *>( calloc( static_cast<uint_32>(ceil(static_cast<float>(2*(MSC_n1_n2[0] + MSC_n1_n2[1])) / 64.0) ), sizeof(uint_64) ) );
MSC_coder_h_lvl_3 = static_cast<uint_64 *>( calloc( static_cast<uint_32>(ceil(static_cast<float>(2*(MSC_n1_n2[0] + MSC_n1_n2[1])) / 64.0) ), sizeof(uint_64) ) );
MSC_coder_l_lvl_1 = static_cast<uint_64 *>( calloc( static_cast<uint_32>(ceil(static_cast<float>(2*(MSC_n1_n2[0] + MSC_n1_n2[1])) / 64.0) ), sizeof(uint_64) ) );
MSC_coder_l_lvl_2 = static_cast<uint_64 *>( calloc( static_cast<uint_32>(ceil(static_cast<float>(2*(MSC_n1_n2[0] + MSC_n1_n2[1])) / 64.0) ), sizeof(uint_64) ) );
MSC_coder_l_lvl_3 = static_cast<uint_64 *>( calloc( static_cast<uint_32>(ceil(static_cast<float>(2*(MSC_n1_n2[0] + MSC_n1_n2[1])) / 64.0) ), sizeof(uint_64) ) );

变量&#34; MSC_n1_n2&#34;,&#34; FAC_N&#34;,&#34; SDC_N&#34;包含要分配的位数。 而uint_64只是stdint中找到的标准int的typedef。

typedef uint64_t uint_64;

现在的问题是它何时进入第二行分配&#34; MSC_coder_h_lvl_2&#34;。我收到一个错误。 - Windows触发了突破点.....

HEAP:释放后在YYY修改的免费堆块XXX

内存位置XXX和YYY每次都在不断变化。但是它总是指向我之前分配但未释放的另一个缓冲区。

如果我点击继续,其余的分配就会没有任何问题。当我查看内存窗口时,所有其他分配的位置都按照预期的方式初始化为零。只有第二个语句失败,这使得&#34; MSC_coder_h_lvl_2&#34;指向0x0000000。

我使用的是calloc而不是new,因为我希望能够调整此缓冲区的大小。

有人可以帮我解决这个问题。

2 个答案:

答案 0 :(得分:1)

在我的代码中发现了问题。我非常愚蠢。与之冲突的早期缓冲区就是问题所在。当我将数据写入该缓冲区时,我超出了其分配的大小。

从此链接http://c-faq.com/~scs/cgi-bin/faqcat.cgi?sec=malloc#crash 问题7.19给了我一个想法,检查我是否超过了限制。 它说在分配的空间malloc之后存储大小等内部信息。当我写的比我应该的更多时,我销毁了这些信息。

因为当我分配一个不同的缓冲区时,它试图在这个已经使用过的块中进行分配,但是我的内部数据已被部分破坏。

我纠正了这个超限问题,现在一切都很好。

答案 1 :(得分:0)

&#34;它总是指向我之前分配但未释放的另一个缓冲区&#34;

我愿意相信你没有故意释放它。但从经验来看,我相信Visual C ++比我更相信你。

在一些可疑文件中,验证这一点的一种快速方法是#define free(X)。当然,这是一个100%的内存泄漏,但当bug消失时,你知道找到了一个不正确的free调用的文件。