传递指针作为参数并进行清理

Passing pointers as arguments and cleaning up

本文关键字:参数 指针      更新时间:2023-10-16

我的代码如下所示:

Function()
{
    struct* str = NULL;
    SomeFunction(&str);
    //continue using str
}
SomeFunction(struct** input)
{
    struct* temp = NULL;
    FillInStruct(&temp);
    *input = temp;
    WTSFreeMemory(temp);
    return;
}

所以我期望在我清理临时之后,我的输入指针也应该变得无效,并且在第一个函数中,我应该不能再使用我的 str 指针了,因为它已经清理了。 但这并没有发生,我真的不知道为什么。我清理了我的临时指针,但我的输入和 str 指针仍然指向正确的结构,我能够继续使用这些指针。有什么想法吗?将 *输入 = 温度;做某种复制?

谢谢。

释放C++中的内存不会对可能指向它的指针执行任何操作。 因此,您的"输入"指针(在 Function() 中又名"str")将在 SomeFunction() 返回后指向释放的内存。 释放后内存的内容以及它保持可用状态的时间完全依赖于编译器,并且有些随机。 某些编译器(如 Visual C++)会在"调试"版本中使用模式填充释放的内存,以便更轻松地捕获此类错误,但前提是使用标准的 C/C++ 操作(malloc/free/new/delete)。

像Java和C#这样的垃圾收集语言(以及许多其他语言)通常没有这种歧义和错误来源。 有什么理由需要使用C++吗?

我建议一种方法,通过将值复制到对象中而不是返回指针来返回值。 我不知道你的"结构"是什么,但让我们称之为"X":

Function()
{
    X thing;
    SomeFunction(&thing);
    //continue using thing
}
SomeFunction(X* input)
{
    X* temp = NULL;
    FillInStruct(&temp);
    *input = *temp;  // copy whole object not just pointer
    WTSFreeMemory(temp);
    return;
}