将指针作为参数传递并清理

时间:2016-06-02 19:25:05

标签: c++ windows pointers

我的代码如下所示:

Function()
{
    struct* str = NULL;
    SomeFunction(&str);
    //continue using str
}

SomeFunction(struct** input)
{
    struct* temp = NULL;
    FillInStruct(&temp);
    *input = temp;
    WTSFreeMemory(temp);
    return;
}

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

感谢。

1 个答案:

答案 0 :(得分:5)

在C ++中释放内存对指向它的指针没有任何作用。所以你的“输入”指针(在Function()中也称为“str”)将指向SomeFunction()返回后释放的内存。释放后该内存的内容以及它保持可用状态的时间长度完全取决于编译器并且有些随机。一些编译器(如Visual C ++)将使用“Debug”构建中的模式填充释放的内存,以便更容易捕获这些类型的错误,但前提是您正在使用标准的C / C ++操作(malloc / free / new /删除)。

垃圾收集语言(如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;
}