我一直在研究C ++如何处理作为参数传递的指针,但到目前为止我的问题还没有找到一个可靠的“是/否”答案。
我是否需要在其上调用delete / free,或者C ++是否足够聪明以清除它们自己的内容?
我从来没有见过有人在传递指针上调用delete,所以我假设你不需要,但我想知道是否有人知道实际需要它时的任何情况。
谢谢!
答案 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参数一样。是否必须对指向的数据执行任何操作是在您和您的代码之间..