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

How does C++ handle cleanup of pointers passed as arguments?

本文关键字:参数传递 指针 何处理 处理 c++      更新时间:2023-10-16

我一直在做一些关于c++如何处理作为参数传递的指针的研究,但到目前为止还没有能够找到一个坚实的"是/否"的答案来回答我的问题。

我需要在它们上调用delete/free吗?还是c++足够聪明,可以自己清除它们?

我从未见过有人在传递的指针上调用delete,所以我认为你不需要,但我想知道是否有人知道实际需要这样做的情况。

谢谢!

作为参数传递的指针所使用的存储空间将被清理。但是它们指向的内存不会被清理。

例如:

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)
}

你会经常听到人们谈论"on the heap"answers"on the stack"。*局部变量(例如参数)存储在堆栈中,并自动清除。数据分配使用new(或malloc)存储在堆上,这不是自动清理。


*然而,c++标准没有讨论"堆栈"answers"堆"(这些实际上是特定于实现的细节)。它分别使用术语"自动存储"answers"分配存储"。

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

如果你从调用者那里收到一个指针,除非另有说明,否则调用者有责任释放该指针。

指针将被"按值"复制。当函数存在时,它们将被销毁,但由于它们的析构函数很简单,因此不会对它们指向的内存做任何操作。

对于指针本身,没有。当参数堆栈帧在函数返回时被消除时,它们就消失了,就像int或char形参一样。你是否必须对指向的数据做任何事情是你和你的代码之间的…

相关文章: