以下代码编译并执行,没有任何警告或错误。但是,当我使用夹板分析代码时,它显示 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 (type obj *) 未在分配前释放: w->o = &pc 。检测到内存泄漏。只有限定的存储在最后一次引用丢失之前不会被释放。
(1) :28:5: 直接地址 &pc 仅隐式分配给: w->o = &pc 。立即地址(& 运算符的结果)传输不一致。
(2) :33:11: 定义前使用的变量 w 使用的右值可能未初始化为某个执行路径上的值。
(3) :34:14: 只有从这个范围内声明的变量派生的存储 wo(类型 obj *)不会被释放(内存泄漏)。怀疑由于结构或深度指针的不完全释放导致的存储泄漏。可从正在解除分配的引用访问的非共享存储尚未被解除分配。Splint 假设当一个对象作为仅输出的 void 指针传递时,外部对象将被释放,但内部对象不会。
这段代码只是对我想要实现的其他东西的测试,但由于我不精通 C,我想了解使用上述方法的内存泄漏风险。
提前致谢。