我猜malloc和goto的关系存在问题。或者,我猜这里有一些内存浪费或内存损坏。希望,有人可以指出我确切的错误。 当我编译它没有给我任何错误,但是,我的大四是坚持我有一个错误。
#define FINISH() goto fini;
BOOL Do()
{
BOOL stat;
UINT32 ptr;
int err;
ptr = (UINT32)malloc(1000);
free((void*)ptr);
fini:
return stat;
}
答案 0 :(得分:4)
以下是我在代码中发现的问题
err != ERROR_SUCCESS
此函数泄漏内存时。它会跳过free
来电。 malloc
的返回值存储到32位位置。这不是便携式解决方案。在64位平台上,这会对您的程序造成严重破坏,因为您要截断地址。如果你必须使用非指针类型,请使用size_t
代替(虽然我会在整数类型上推荐一个指针)stat
。如果err != ERROR_SUCCESS
,您将返回垃圾。需要始终为其分配值。最简单的方法是提供默认方式。malloc
的返回值,并可能会将隐藏的NULL
指针传递到Fun2
这是我建议编辑的功能
BOOL Do()
{
BOOL stat = FALSE;
size_t ptr = 0;
int err;
ptr = (UINT32)malloc(1000);
err = Fun1();
if (err != ERROR_SUCCESS || ptr == 0)
FINISH();
else
stat = Fun2(ptr);
fini:
free((void*)ptr);
return stat;
}
答案 1 :(得分:3)
malloc
返回一个指针。您正在转换指向整数的指针,但指针和整数不需要具有相同的表示。例如,指针大小可能是64位,并且不适合您的整数。
对象stat
也可以在函数中使用not-initialized。如果没有显式初始化,对象stat
在声明后会有一个不确定的值。
答案 2 :(得分:1)
我们不知道应该做什么,但如果Fun1()
没有返回ERROR_SUCCESS
,那么ptr
永远不会被释放。据推测,这是你老板所说的错误。
答案 3 :(得分:1)
您正在将指针转换为uint32_t
并再次返回。这会擦除指针值的上半部分。
答案 4 :(得分:0)
无论你做什么,你都不是在编译代码。它有语法错误。
if(foo)
bar;;
else
baz
检查您的构建系统。
答案 5 :(得分:0)
我的整体评论,以及在C中工作的一般经验法则...如果你必须做指针演员,问问自己:你真的需要吗?你真正需要做指针演员的时间非常罕见。更常见的是当人们使用指针转换时,因为他们在理解上有一些差距,不清楚他们正在尝试做什么或应该做什么,并试图使编译器警告静音。
ptr = (UINT32)malloc(1000);
非常糟糕!如果你对这个“指针”做任何事情,如果它适用于64位平台,你将非常幸运。将指针保留为指针类型。如果你绝对必须将它们存储在整数中,请使用保证足够大的uintptr_t
。
我说你可能一直在尝试:
// Allocate 1,000 32-bit integers
UINT32 *ptr = (UINT32*)malloc(1000 * sizeof(UINT32));
然而即使这对于C代码来说也是一种糟糕的形式,这是一种奇怪的C和C ++混合。与C ++不同,在C中你只需要void *
并隐式将它带到任何指针类型:
// Allocate 1,000 32-bit integers
UINT32 *ptr = malloc(1000 * sizeof(UINT32));
最后,
free((void*)ptr);
施放到void*
是另一个大红旗,经常表明作者不知道他们在做什么。将ptr
更改为实际指针类型后,只需执行以下操作:
free(ptr);