我有一些愚蠢的问题(可能对大多数人来说),它不是关于'我如何'做这些问题,更多关于'为什么'这样做?我知道你不应该问多个问题,但这些问题相当小,与一个主题有关。将它们分开似乎是一种浪费。
我理解大多数指针和操作符本身。 (虽然我很好奇为什么*
被称为去引用运算符,因为它不是指它包含的引用?)
即:
int x = 25;
int *p = &x;
所以&
是有道理的,因为*p
是int
类型堆栈中包含x
地址的地方(我们知道它是25)。< / p>
所以说*p
我们正在引用'{1}}指向25的地址。也许它只是一个英语语义的东西?也许有人可以解释为什么它被称为'去参考'?
获取此有效代码示例:
p
很简单,我们在堆栈中创建了一个新的位置,其大小为int *p = new int;
*p = 5
指针(无论可能是什么)。 int
将包含一个值为5的地址。
事实上,我实际上并没有声明任何存储5的东西,那么p
指向的是什么?我的意思是,这确实有用,但我从未做过p
或类似的事情,并将地址指向int x = 5
指向?它甚至怎么知道?
p
包含一个指向某个地址的地址,但我从未指出它指向的“地址”?编译器是否只知道在其他地方创建另一个地址? (对不起,如果这是一个非常愚蠢的问题。)
我在这里读到关于另一个问题的一些内存泄漏:
p
首先假装A *object1 = new A();
是一个类。有人说A
存储object1
的值。这不正确吗? A
不存储object1
创建并指向它的地址吗?
因为new A()
删除了指向delete object1
的指针(但是从另一个问题new A()
确实是正确的语法。所以这样做会留下delete object1
在那里闲逛?还是会自动删除?(你可以说我有点困惑。)
如果new A()
确实删除了指针指向而不是指针本身的内容,那么这不会留下悬空指针吗?
答案 0 :(得分:2)
下面
int x = 25;
int *p = &x;
*
不是解除引用运算符。它是p
类型的一部分。它基本上说p
是一个指针。
下面
int *p = new int;
*p = 5;
关键是new int
。它会动态创建int
并返回其地址,因此p
现在指向该地址。 *p = 5
(顺便说一句,这里*
是解除引用的运算符)修改了dymanically assigned int的值 - 到5
object1
包含新创建的A
的地址。由于我们在这里,我们应该澄清这一点:A
是(用户定义的)类型。因此,A
具有值是没有意义的。 A
类型的对象具有值。 delete p
不会删除指针。它做了两件事:
指针实际上没有改变,即它仍指向同一地址。只是现在该地址没有被分配,即不能被解除引用。
您可以进一步参考此SO answer - Static, automatic and dynamic storage duration以进一步了解对象,指针,new
/ delete
。
答案 1 :(得分:1)
1:当你说&#34;我们知道的是25&#34;时,我不确定你暗示的是什么。 x的地址不是25,而是x的值。您没有在int x = 25
但是要回答你的问题,p
是一个参考,也就是说它的值是一个地址。访问存储在地址p
中的值需要*p
,它会取消引用指针。
2:您已为p
分配了内存;你执行了new
。您已为堆上的新整数分配了4(或8)个字节的内存,因此p指向新分配的内存块。说*p = 5;
告诉编译器将存储在该地址的值设置为5。
3:你的假设是正确的; object1
不存储新A
的值,而是指向与大小为A
的对象的实例大小相当的内存块。
delete object1;
不删除指针。指针只是堆栈上的一个整数,而是将指针的已分配内存返回给系统。 A
因为你知道它被删除了,但指针仍然存在,此时使用它是未定义的行为。假设您现在有一个悬空指针,这是正确的,这就是为什么总是将删除的指针设置为NULL
的原因。