typedef struct _MY_STRUCTURE_ {
int param1;
int param2;
int param3;
int param4;
int param5;
int param6;
} MY_STRUCTURE, *pMY_STRUCTURE;
class Test {
public:
void doSomethings(pMY_STRUCTURE myStructure);
};
void Test::doSomethings(pMY_STRUCTURE myStructure) {
printf("%p\n", &myStructure->param2);
myStructure->param1 = 10;
}
int main() {
pMY_STRUCTURE myStructure = (pMY_STRUCTURE)malloc( sizeof(pMY_STRUCTURE) );
Test *t = new Test();
myStructure->param2 = 0;
// Prints 0
printf("%i\n", myStructure->param2);
// Prints the address
printf("%p\n", &myStructure->param2);
t->doSomethings(myStructure);
// Warning about potential memory leak?
printf("%p\n", &myStructure->param2);
}
如我的代码文档中所示,根据 Qt 软件,最后打印语句的行存在潜在的内存泄漏。为什么这可能是内存泄漏?是这样吗?如果是,为什么?
消息:“t”指向的内存潜在泄漏[clang-analyzer-cplusplus.NewDeleteLeaks]
此外,这段代码执行得很好,但我还有另一段代码,风格相同,但功能更多,我发现 void 中的 print 语句与 void 之前和之后的 print 语句相比提供了不同的地址打电话。
导致泄漏的不是行
printf("%p\n", &myStructure->param2);
,而是您使用malloc
分配内存而不稍后调用free
,并且使用new
分配内存而不稍后调用delete
。但这并不是您的代码的唯一问题。
在 C++ 中,很少需要直接调用
operator new
,并且几乎不需要使用 malloc
分配内存(它不调用构造函数)。
sizeof(pMY_STRUCTURE)
也肯定不会按照你的想法去做。它返回指针的大小,而不是结构的大小,因此您分配 8 个字节(简化典型 x64 架构的指针大小),然后要求将其重新解释为指向至少需要 24 个字节的结构的指针。访问 param3
- param6
成员值将是未定义的行为。