C++ 堆栈内存分配和释放机制

C++ 堆栈内存分配和释放机制,c++,stack,memory-management,C++,Stack,Memory Management,如果我将值作为参数传递给特定函数,那么当函数执行结束时,该函数是否会释放此参数的内存 如果我传递一个指针或引用作为参数,如果函数释放指针参数的内存,会发生什么?它会影响函数外的变量吗 在第一种情况下,内存将被“释放”(实际上堆栈指针将增加)。如果这不是POD类型,则调用变量析构函数,因此如果在堆中分配了内存,则将从堆中释放内存 在第二种情况下,指针引用的值不会被释放-只有指针的内存会被释放 对于第1点,它取决于参数的类型。例如,通过值传递“字符串”将进行隐式复制,当变量(函数参数)超出范围时,复

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


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

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


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

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

对于第二种情况——是的,使用指针解除分配将影响它所寻址的内存——包括函数内部和外部

为了澄清第二点:

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

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

…将删除分配的内存-在对func的调用失败后使用
myArray

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

按照堆栈的工作方式,您可以继续“分配”更多内存,但必须以相反的顺序“释放”

因此:

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

此推和弹出操作对原始指针或值没有影响。因此:

ptr++;
不会影响调用函数持有的指针值


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

总是有一个隐式复制构造函数,即使对于您自己的类型也是如此。如果您不需要特定的语义,它们将以与“字符串”相同的方式自动管理。@Roberto:我说的是分配内存的类型。我应该说‘不一定会自动发生’:)
ptr++;