Joj*_*oji 0 c c++ malloc heap-memory
我是 C 和 C++ 新手。我知道每当调用一个函数时,它的变量都会在堆栈上分配内存,包括变量恰好是一个指针,该指针指向通过mallocor分配在堆上的数据new(但我听说不能保证malloc分配的存储100%在堆上,如果我错了,请纠正我)。例如,
Void fn(){\n Member *p = new Member()\n}\n \nRun Code Online (Sandbox Code Playgroud)\n或者
\nVoid fn() {\n int *p = (int*) malloc( sizeof(int) * 10 ); \n}\nRun Code Online (Sandbox Code Playgroud)\n如果我错了,请纠正,在这两种情况下,变量p(保存堆上分配的对象的地址)都在堆栈上,并且它指向堆上的对象。\n所以说所有的都正确吗?我们声明的变量位于堆栈上,即使它们可能指向堆上的某些内容?\n让\xe2\x80\x99s 说局部变量指针的地址p加载到内存地址001,它具有位于堆上的成员对象的地址,该地址是002。我们可以画这样的图。\n
如果这是正确的,我的下一个问题是,我们是否可以拥有一个实际位于堆上的指针,并且它指向位于堆栈上的变量?如果不可能,该指针是否可以指向位于堆上的变量?\n也许这个问题的另一种表达方式是:为了访问堆中的某些内容,我们只能通过堆栈上的指针来访问它?\n可能的图表如下所示
\n如果可能的话,我可以在这里举个例子吗?
\n\n是的,您可以将指针放在空闲存储(堆)上并使其指向堆栈上的变量。技巧是创建一个指向指针 (int**) 的指针:
int main()
{
int i = 0; // int on the stack
int** ip = new int*; // create an int* (int pointer) on the free store (heap)
// ip (the int**) is still on the stack
*ip = &i;
// Now your free store (heap) located pointer points
// to your stack based variable i
delete ip; // clean up
}
Run Code Online (Sandbox Code Playgroud)
注意:术语“堆”和“堆栈”是通用的、易于理解的计算术语。在 C++ 中,它们在标准中被称为“自由存储”,并且(尽管没有直接命名)“堆栈”是 100% 隐含的(例如,通过引用“堆栈展开”),因此是必需的。
| 归档时间: |
|
| 查看次数: |
1236 次 |
| 最近记录: |