让我说我有这个。
int ***a = new int**;
*a = new int*;
**a = new int;
***a = 18
所以我们有这样的事情。 [*] -> [*] -> [*]->[18]
堆栈中是否包含所有这些指针以及它们指向堆中的所有内容?
答案 0 :(得分:4)
假设您的代码内联函数
int ***a = new int**;
a在堆栈上。它指向堆上的东西(thing1)
*a = new int*;
a在堆栈上。它指向thing1。 thing1现在指向堆上的其他东西(thing2)
**a = new int;
a在堆栈上。它指向thing1。 堆上的thing1指向堆上的thing2。 thing2指向堆上的int
***a = 18
a在堆栈上。它指向thing1。 堆上的thing1指向堆上的thing2。 thing2指向堆上的int。 那个int现在= 18。
答案 1 :(得分:0)
第一个指针在堆栈上。其余的都在堆上,因为它们是使用new分配的。
答案 2 :(得分:0)
a
在堆栈中。由new
创建的其余部分位于堆
答案 3 :(得分:-3)
要理解代码的作用,堆栈的概念是不必要的。您使用的某些实现可能会将a
置于堆栈中,但这并未改变代码的含义,并且此详细信息对于理解代码的作用并不是必需的。
如果你不相信我:在C ++标准中,单词堆栈只引用std::stack
和抽象的堆栈展开概念。
具体而言,我们必须假设您的代码是如何使用的。让我们假设它在一个自己的块中:
{
int ***a = new int**;
*a = new int*;
**a = new int;
***a = 18;
}
我们关心的是各种存储的存储持续时间。
a
具有自动存储时长。存储一直存在,直到结束括号。
a
指向动态存储持续时间类型int**
的存储。存储会持续到您明确取消分配为止 - 在这种情况下,它会比a
更长。
*a
指向动态存储持续时间类型int*
的存储。在这里,存储也会持续到你明确解除分配为止 - 在这种情况下,它会比a
更长。
**a
指向动态存储持续时间类型int
的存储。在这里,存储也会持续到你明确解除分配为止 - 在这种情况下,它会比a
更长。
***a
是存储在int(18)
指向的动态存储空间中的值**a
。
程序的功能及其行为与这些存储持续时间有关。它与a
是否在某个堆栈上无关。尽管如此,您已使用emscripten编译了此代码,并且该值存在于javascript变量中。
a
的存储持续时间是自动的,重要的是在这种情况下它的范围是块的结尾。您使用new
分配的所有内容的存储时间都是动态的,完全由您控制。
根据显示的代码,没有长期的方式来访问具有动态存储持续时间的三个存储:它们将超过a
的存储持续时间和< / em>一旦块结束就变成内存泄漏。如果您将a
传递出去,您将能够阻止这种情况并保留访问所有三个动态存储持续时间存储的方式。