【发布时间】:2014-04-01 04:52:20
【问题描述】:
以下代码编译并执行,没有任何警告或错误。但是,当我使用splint 分析代码时,它显示了 4 个警告(显示在代码下方)。
我见过的大多数示例(带有那种警告)都使用 malloc 和 free。由于此代码不使用 malloc,我们可以说忽略这些警告是安全的吗?在不删除指针的情况下编写代码的正确方法应该是什么?
#include <stdio.h>
typedef struct
{
void (*Doit) ( void );
} func;
typedef struct
{
func f;
int val;
} obj;
typedef struct
{
obj *o;
} world;
static void Read( void ) {
printf( "Read\n");
}
static void Init( world *w ) {
obj pc;
w->o = &pc; //(1)
w->o->val = 10;
w->o->f.Doit = Read;
w->o->f.Doit();
}
int main() {
world w;
Init( &w ); //(2)
return 0; //(3)
}
(1) :28:5: 仅隐式存储 w->o(类型 obj *)在分配之前未释放: w->o = &pc 。检测到内存泄漏。唯一限定的存储在最后一次引用丢失之前不会释放。
(1) :28:5: 直接地址 &pc 仅隐式分配给: w->o = &pc 。立即地址(& 运算符的结果)传输不一致。
(2) :33:11: 定义前使用的变量 w 使用的右值可能未初始化为某个执行路径上的值。
(3) :34:14: 只有从这个范围内声明的变量派生的存储 w.o(类型 obj *)不被释放(内存泄漏)。怀疑由于结构或深度指针的不完全释放导致的存储泄漏。可从正在解除分配的引用访问的非共享存储尚未被解除分配。 Splint 假设当一个对象作为一个 out only void 指针传递时,外部对象将被释放,但内部对象不会。
这段代码只是对我想要实现的其他东西的测试,但由于我不精通 C,我想了解使用上述方法的内存泄漏风险。
提前致谢。
【问题讨论】:
-
虽然我很久以前学过 C 课程,但我必须继续阅读有关 C 中内存管理的更多详细信息(我已经习惯了高级语言)。
标签: c pointers memory-leaks splint