调用递归函数时内存是如何分配的?一个函数有它自己分配的内存。当它被调用时,参数(不是引用传递的参数)和变量获得内存。那么,当从函数体内再次调用该函数时,如何将内存分配给第二次调用的变量和参数? 最佳答案 递归函数与任何其他函数没有什么不同——自动局部变量通过将堆栈指针推进到足够远以说明它们的大小总和(加上对齐所需的任何填充)而作为单个block分配。每个递归调用都会以这种方式压入一个新的堆栈帧,然后在返回时将其弹出。如果递归未能达到基本情况,堆栈将迅速耗尽,导致同名的StackOverflow崩溃。
当我在这个page上读到Stack和Heap的例子时,我有一个问题,如果像页面上给出的示例一样,一个函数将其所有局部变量放在堆栈上,堆栈实际上是否访问不同的变量?因为堆栈通常只能访问顶部,所以它只能访问函数的一个变量。这是否意味着函数的变量存储在堆栈上的结构中? 最佳答案 堆栈指针,顾名思义,是一个和其他指针一样的指针,它指向普通的标准内存。要访问堆栈的任何区域,您只需向指针添加一个偏移量。如果你从C指针的角度来考虑它,你就有堆栈指针char*stack_pointer=some_memory;这个指针然后可以用作普通指针,包括添加
与数组中元素的普通分配相比,使用动态内存分配创建数组有什么优势? 最佳答案 您不必事先知道数组的大小,也不必为大型数组过度分配内存。这使您的程序可以更高效地使用内存。 关于c++-动态内存分配,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2311108/
当我们在c++中实例化一个变量,如函数中的intx(即x是一个局部变量)时,它被分配在进程的堆栈顶部。但是如果我们执行int*x=newint,空间将在堆中提供。所以,我的问题是:不同类(c++提供的类或用户定义的类)的对象呢?他们的对象在哪里实例化?例如:让Employee是一个类,我们声明Employeeemp;。emp在堆栈或堆中的何处给定空间->?如果声明inta[4]在一个函数内,a的所有四个单元是否都在堆栈上获得空间? 最佳答案 所有局部变量,无论是来自类的内置类型,还是数组,都在堆栈上。所有动态分配都在堆上。当然,局部
char*myfunc(){char*temp="string";returntemp;}在这段代码中,temp指向的对象的分配发生在哪里,它的作用域是什么?这个函数是返回char*指针的有效方法吗? 最佳答案 代码是否正确?是的,您的代码(几乎)没问题,因为"string"是一个字符串文字,位于静态存储中。注意:指针只是一个存储内存地址的变量。此行只是将字符串文字“string”的地址存储在名为temp的变量中。char*temp="string";C++标准保证字符串文字将在程序运行期间保留在内存中,如下面定义的那样。这意味着您
这是栈上的分配:charinStack[10];//andMyStructcl;这应该在堆中分配:char*inHeap=newchar[10];//andMyClasscl=newMyClass();如果MyClass包含一个chartest[10]变量怎么办?这样做:MyClasscl=newMyClass()...意味着MyClass::test的10字节长的内容分配在堆中而不是堆栈中? 最佳答案 会在对象内部分配,这样如果对象在堆上,数组也会在堆上;如果对象在栈上,数组也会在栈上;如果对象在可执行文件的静态内存中,数组也会在
intmain(intargc,charconst*argv[]){constchar*s1="hello";strings2;s2=s1;s2.reserve(10);s2[5]='.';s2[6]='o';s2[7]='\0';cout上面的代码没有正确打印s2。它始终打印hello而不是hello.o。似乎s2的大小在第一次分配后始终保持在5。为什么会这样? 最佳答案 operator[]不会调整字符串的大小。并且您使用索引5、6和7对它的调用超出范围且行为未定义。使用resize将字符串设置为特定大小,或使用push_bac
我知道newdelete与mallocfree不兼容。这是否意味着我应该避免对将由C库使用的内存使用new?当我将内存传递给C库时,使用new而不是malloc会出现什么问题?voidfunc(){int*p=newint(42);//ShouldIinsistonusingmallocforpifthisfunctionisapart//ofaClibrary?lib_func(p);} 最佳答案 内存就是内存,怎么分配都无所谓。只要您将new与delete、new[]与delete[]以及malloc/calloc和free(还
在学习不同的语言时,我经常看到动态分配的对象,最常见的是在Java和C#中,如下所示:functionCall(newclassName(initializers));我知道这在内存管理语言中是完全合法的,但是这种技术可以在C++中使用而不会导致内存泄漏吗? 最佳答案 您的代码是有效的(假设functionCall()实际上保证了指针被删除),但它很脆弱并且会在大多数C++程序员的头脑中敲响警钟。您的代码存在多个问题:首先,谁拥有指针?谁负责释放它?调用代码无法执行此操作,因为您没有存储指针。这意味着被调用的函数必须执行此操作,但查
我尝试在堆和栈内存中为10^7个整数分配空间,看看哪个更快。显然在堆内存中分配要快得多,但我不明白原因。#include#includeusingnamespacestd;usingnamespacestd::chrono;intmain(){high_resolution_clock::time_pointt1=high_resolution_clock::now();int*p=newint[1e7];high_resolution_clock::time_pointt2=high_resolution_clock::now();autoduration=duration_cast