堆栈内存分配和释放机制

时间:2010-12-11 11:45:45

标签: c++ stack memory-management

如果我将值作为参数传递给特定函数,那么当函数执行结束时,该函数是否会释放该参数的内存?

如果我将指针或引用作为参数传递,如果函数释放指针参数的内存会发生什么?它会影响函数外的变量吗?

3 个答案:

答案 0 :(得分:0)

在第一种情况下,内存将被“解除分配”(实际上堆栈指针将被增加)。如果这不是POD类型,则调用析构函数,因此如果在那里分配了内存,则将从堆中释放内存。

在第二种情况下,指针引用的值不会被释放 - 只有指针的内存才会被释放。

答案 1 :(得分:0)

对于第1点,它取决于参数的类型。通过,例如按值的“字符串”将执行隐式复制,并且当变量(函数参数)超出范围时,将释放复制使用的内存。对于您自己的类型,这不会自动发生 - 您需要正确设置构造和销毁。

对于第二个 - 是的,使用指针解除分配会影响它所处理的内存 - 无论是在函数内还是在外部。

澄清第二点:

void func(char *someMemory) {
  delete[] someMemory;
}

//...
char *myArray = new char[100];
func(myArray);

...将删除已分配的内存 - 在调用func后使用myArray为BAD。

答案 2 :(得分:0)

如果在堆栈上传递值或指针,则保存该值所需的内存在堆栈中分配 ...

堆栈的工作方式可以保持“分配”更多内存,但必须以相反的顺序“释放”。

所以:

void f(int *ptr, int v)
{
// Do something
}

当你调用f()时,ptr和v的值被“推”到堆栈上,就会神奇地创建足够的内存来保存这些值。当函数返回时,堆栈会以另一种方式调整,从某种意义上说,它们会从堆栈中“弹出”。

此推送和弹出对原始指针或值没有影响。所以:

ptr++;

不会影响调用函数所持指针的值。

如果取消引用,* ptr,您正在访问从该函数外部可见的相同数据的指针。如果你释放()指针,这将影响从函数外部看到的内容。因此,当您传递指针时,没有指针指向的原始数据的副本,但是存在由实际指针构成的副本。指针按值传递。