【发布时间】:2014-03-03 23:40:28
【问题描述】:
我不得不使用其他人的代码,因此我无法完全控制我可以更改的内容,但我想知道为什么会出现此错误,并希望得到任何建议。这段代码在我无法更改的部分,但我需要确保我编写的部分(StringRef 类)有效。
它给我的错误是“X 处的堆块在 Y 超过请求的 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;
}
对
StringRef *t_new_elements;
t_new_elements = (StringRef *)malloc((self.count + 1) * sizeof(StringRef *));
对于带有 realloc 的行可以进一步避免问题。
【问题讨论】:
-
你了解
realloc和malloc的区别吗?如果不是,您可能应该先这样做。realloc将复制分配的旧内容,malloc不会。将代码更改为使用malloc完全泄露了之前的分配,也忘记了self.elements之前的所有内容。不要“把罐子踢到路上”。找出真正的错误(缓冲区溢出)并修复它。 -
这段代码唯一符合 C++ 条件的两件事是使用
std::cout和一个引用。如果有人称它为 C++,我会为你感到难过。 -
我确实“基本上”了解它们之间的区别。我只是想对现有代码进行足够的修改,以使我编写的代码可以运行或不运行。我对 C++ 有点熟悉(但生疏)。我知道有些人在用 C++ 编码时喜欢使用一个/或/两个(正如这段代码的作者所做的那样)。我不知道如何追踪缓冲区溢出,除了我已经在做的改变可能是问题的因素并试图追踪错误的来源。
-
realloc可用于 1) 分配内存块 2) 调整成员块的大小和 3) 释放内存块。出于这个原因,在您的代码中单独使用realloc非常舒服,但要小心!在某些平台上realloc将现有块大小为零frees 块,而在其他一些平台上它只返回一个大小为零的块,该块必须稍后是freed。 -
@pasztorpisti - 代码的作者只是用它来调整数组的大小,所以它不应该在这里产生副作用。
标签: c++ c visual-studio-2010 visual-c++