【发布时间】:2017-06-08 07:58:31
【问题描述】:
代码如下:
int main()
{
using namespace std;
int nights = 1001;
int * pt = new int; // allocate space for an int
*pt = 1001; // store a value there
cout << "nights value = ";
cout << nights << ": location " << &nights << endl;
cout << "int ";
cout << "value = " << *pt << ": location = " << pt << endl;
double * pd = new double; // allocate space for a double
*pd = 10000001.0; // store a double there
cout << "double ";
cout << "value = " << *pd << ": location = " << pd << endl;
cout << "location of pointer pd: " << &pd << endl;
cout << "size of pt = " << sizeof(pt);
cout << ": size of *pt = " << sizeof(*pt) << endl;
cout << "size of pd = " << sizeof pd;
cout << ": size of *pd = " << sizeof(*pd) << endl;
return 0;
}
下面是作者对代码的注释:
需要注意的另一点是,通常 new 使用与我们一直使用的普通变量定义不同的内存块。变量 nights 和 pd 的值都存储在称为 stack 的内存区域中,而由 new 位于称为堆或空闲存储区的区域中。
最初的问题:
现在我担心的是:变量 pd 是由关键字 new 创建的,所以它应该存储在名为 heap 的区域中就像变量 pt 一样,因为它们都是由关键字 new 创建的。
我在这里遗漏了什么吗?非常感谢您的意见。
基于保留的修订问题/跟进:
这个问题被 5 个人搁置了,因为他们不明白我在问什么。我相信我的问题已经得到解答,但是对于那些仍然不确定我最初问什么的人,请继续阅读:
我不清楚作者关于变量及其值在内存中的存储位置的解释。根据作者的解释,我相信使用关键字 new 动态创建的任何内存(或者我应该说是在编译后的运行时)都会存储在 heap 中,而不是堆栈。
所以,当他写到 pd 的变量是 value 时,我感到很困惑 存储在 stack 中,但如果变量 是在“运行时”使用关键字 new 创建的,所以它应该是 在堆,而不是堆栈。
请尝试使用上面的代码作为参考,尤其是您的答案中的**变量(nights、pd 和 pt),以便我可以从该代码的角度理解它。
【问题讨论】:
-
您并没有错过太多。本书的作者将实现细节与 C++ 本身的语义混合在一起。我建议买一本更好的书。
-
pd在栈上(持有指针),pd指向的在堆上。 -
-6 对于具有可编译代码的编写良好的问题特别苛刻。有什么办法可以改进这个问题?这本书是由布偶写的这一事实与 OP 无关,除了他们的选书技巧。
-
我在 Google 上搜索“是堆栈或堆上的指针”,第一个结果是 this question,它回答了 OP 关于堆栈/堆上的指针的直接问题。因此,缺乏研究可能是一个有效的主张。
-
看看here