realloc错误但不是malloc?

时间:2014-03-03 23:40:29

标签: c++ c visual-studio-2010 visual-c++

我不得不与其他人的代码合作,所以我并不完全控制我可以改变的内容,但我想知道为什么我会收到此错误,并希望得到任何建议。这段代码是我无法改变的部分,但我需要确保我写的部分(StringRef类)有效。

它给我的错误是'在X处修改的堆块,在过去请求的大小为28'时修改了'。如果我将使用realloc的现有代码更改为malloc,它会向下推动一些内容并将更多值加载到数组中。这是有问题的行。我不能包含所有代码,因为它太广泛了。这是否足以诊断我做错了什么?

struct StringList
{
    StringRef *elements;
    unsigned int count;
};

.....

// Append the given StringRef to the list.
bool StringListAppend(StringList& self, StringRef p_string)
{

    StringRef *t_new_elements;
    t_new_elements = (StringRef *)realloc(self.elements, (self.count + 1) * sizeof(StringRef *));
    if (t_new_elements == NULL)
        return false;

    self.elements = t_new_elements;
    std::cout<<self.count<<"\n";
    // Initialize and assign the new element.
    StringInitialize(self.elements[self.count]);
    if (!StringAssign(self.elements[self.count], p_string))
        return false;

    // We've successfully added the element, so bump the count.
    self.count += 1;

    return true;
}

VS

StringRef *t_new_elements;
t_new_elements = (StringRef *)malloc((self.count + 1) * sizeof(StringRef *));
带有realloc的行的

可以进一步避免这个问题。

2 个答案:

答案 0 :(得分:2)

假设您希望分配一些内存。 您应该使用malloc(在未初始化的堆上存储内存)或calloc(存储将所有元素初始化为0)。 Explained more Here!

Realloc扩展了已分配内存的长度。所以你需要在扩展之前分配一些。 (不要 neeed ,但这样做是很好的编码实践)Realloc

我建议更多关注内存分配,因为滥用它会大大降低效率,必须采取预防措施,例如:你应该总是释放你在程序结束时分配的内存!

答案 1 :(得分:2)

sizeof(StringRef *)应为sizeof(StringRef)

您可以使用此惯用语来避免此错误:

ptr = realloc(old_ptr, n_elements * sizeof *ptr);

当要分配的字节数是根据保存返回指针的变量的类型确定的;它不要求你重复任何事情,从而引入差异。

至于为什么将realloc更改为malloc会略微移动程序崩溃的点...未定义的行为未定义:)