C ++如何处理作为参数传递的指针的清理?

时间:2011-12-26 13:47:07

标签: c++ pointers memory-management arguments

我一直在研究C ++如何处理作为参数传递的指针,但到目前为止我的问题还没有找到一个可靠的“是/否”答案。

我是否需要在其上调用delete / free,或者C ++是否足够聪明以清除它们自己的内容?

我从来没有见过有人在传递指针上调用delete,所以我假设你不需要,但我想知道是否有人知道实际需要它时的任何情况。

谢谢!

5 个答案:

答案 0 :(得分:9)

用于作为参数传递的指针的存储将被清除。但他们指出的记忆不会被清理干净。

所以,例如:

void foo(int *p)  // p is a copy here
{
    return;
    // The memory used to hold p is cleared up,
    // but not the memory used to hold *p
}

int main()
{
    int *p = new int;
    foo(p);   // A copy of p is passed to the function (but not a copy of *p)
}

你会经常听到人们谈论“在堆上”和“在堆栈上”。 * 局部变量(例如参数)存储在堆栈中,自动清理。使用new(或malloc)分配的数据存储在堆上,不会自动清理。

<小时/> *但是,C ++标准没有谈论“堆栈”和“堆”(这些实际上是特定于实现的细节)。它分别使用术语“自动存储”和“分配存储”。

答案 1 :(得分:4)

传递给方法的参数存储在堆栈中,因此在函数返回时会自动销毁 - 就像本地变量一样。它们指向的内存不会自动释放。

答案 2 :(得分:2)

如果你收到来自你的调用者的指针,除非另有说明,否则调用者有责任释放该指针。

答案 3 :(得分:1)

指针将被复制 - “按值”接受。当函数存在时,它们将被销毁,但由于它们的析构函数是微不足道的,因此它们所指向的内存将不会被执行。

答案 4 :(得分:1)

关于指针本身,没有。它们在函数返回时消除参数堆栈帧,就像int或char参数一样。是否必须对指向的数据执行任何操作是在您和您的代码之间..