我不得不与其他人的代码合作,所以我并不完全控制我可以改变的内容,但我想知道为什么我会收到此错误,并希望得到任何建议。这段代码是我无法改变的部分,但我需要确保我写的部分(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的行的可以进一步避免这个问题。
答案 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
会略微移动程序崩溃的点...未定义的行为未定义:)