为什么这是潜在的内存泄漏?

问题描述 投票:0回答:1
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 语句相比提供了不同的地址打电话。

c++ qt memory-leaks
1个回答
0
投票

导致泄漏的不是行

printf("%p\n", &myStructure->param2);
,而是您使用
malloc
分配内存而不稍后调用
free
,并且使用
new
分配内存而不稍后调用
delete
。但这并不是您的代码的唯一问题。

在 C++ 中,很少需要直接调用

operator new
,并且几乎不需要使用
malloc
分配内存(它不调用构造函数)。

sizeof(pMY_STRUCTURE)
也肯定不会按照你的想法去做。它返回指针的大小,而不是结构的大小,因此您分配 8 个字节(简化典型 x64 架构的指针大小),然后要求将其重新解释为指向至少需要 24 个字节的结构的指针。访问
param3
-
param6
成员值将是未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.