一些基本的指针问题

时间:2015-11-02 19:56:02

标签: c++ pointers

我有一些愚蠢的问题(可能对大多数人来说),它不是关于'我如何'做这些问题,更多关于'为什么'这样做?我知道你不应该问多个问题,但这些问题相当小,与一个主题有关。将它们分开似乎是一种浪费。

  1. 我理解大多数指针和操作符本身。 (虽然我很好奇为什么*被称为去引用运算符,因为它不是指它包含的引用?)

    即:

    int x = 25;
    int *p = &x;
    

    所以&是有道理的,因为*pint类型堆栈中包含x地址的地方(我们知道它是25)。< / p>

    所以说*p我们正在引用'{1}}指向25的地址。也许它只是一个英语语义的东西?也许有人可以解释为什么它被称为'去参考'?

  2. 获取此有效代码示例:

    p

    很简单,我们在堆栈中创建了一个新的位置,其大小为int *p = new int; *p = 5 指针(无论可能是什么)。 int将包含一个值为5的地址。

    事实上,我实际上并没有声明任何存储5的东西,那么p指向的是什么?我的意思是,这确实有用,但我从未做过p或类似的事情,并将地址指向int x = 5指向?它甚至怎么知道?

    p包含一个指向某个地址的地址,但我从未指出它指向的“地址”?编译器是否只知道在其他地方创建另一个地址? (对不起,如果这是一个非常愚蠢的问题。)

  3. 我在这里读到关于另一个问题的一些内存泄漏:

    p

    首先假装A *object1 = new A(); 是一个类。有人说A存储object1的值。这不正确吗? A不存储object1创建并指向它的地址吗?

    因为new A()删除了指向delete object1的指针(但是从另一个问题new A()确实是正确的语法。所以这样做会留下delete object1在那里闲逛?还是会自动删除?(你可以说我有点困惑。)

    如果new A()确实删除了指针指向而不是指针本身的内容,那么这不会留下悬空指针吗?

2 个答案:

答案 0 :(得分:2)

  1. 下面

    int x = 25;
    int *p = &x;
    
  2. *不是解除引用运算符。它是p类型的一部分。它基本上说p是一个指针。

    1. 下面

      int *p = new int; 
      *p = 5;
      
    2. 关键是new int。它会动态创建int并返回其地址,因此p现在指向该地址。 *p = 5(顺便说一句,这里*是解除引用的运算符)修改了dymanically assigned int的值 - 到5

      1. 确实object1包含新创建的A的地址。由于我们在这里,我们应该澄清这一点:A是(用户定义的)类型。因此,A具有值是没有意义的。 A类型的对象具有值。
      2. delete p不会删除指针。它做了两件事:

        • 销毁由new-expression
        • 创建的对象
        • 释放先前由匹配运营商新
        • 分配的存储空间

        指针实际上没有改变,即它仍指向同一地址。只是现在该地址没有被分配,即不能被解除引用。

        您可以进一步参考此SO answer - Static, automatic and dynamic storage duration以进一步了解对象,指针,new / delete

答案 1 :(得分:1)

1:当你说&#34;我们知道的是25&#34;时,我不确定你暗示的是什么。 x的地址不是25,而是x的值。您没有在int x = 25

等语句中设置x的地址

但是要回答你的问题,p是一个参考,也就是说它的值是一个地址。访问存储在地址p中的值需要*p,它会取消引用指针。

2:您已为p分配了内存;你执行了new。您已为堆上的新整数分配了4(或8)个字节的内存,因此p指向新分配的内存块。说*p = 5;告诉编译器将存储在该地址的值设置为5。

3:你的假设是正确的; object1不存储新A的值,而是指向与大小为A的对象的实例大小相当的内存块。

delete object1;不删除指针。指针只是堆栈上的一个整数,而是将指针的已分配内存返回给系统。 A因为你知道它被删除了,但指针仍然存在,此时使用它是未定义的行为。假设您现在有一个悬空指针,这是正确的,这就是为什么总是将删除的指针设置为NULL 的原因。