【问题标题】:allocating space for pointer为指针分配空间
【发布时间】:2023-03-31 22:25:02
【问题描述】:

假设我有一个指针 ptr 并且我为该指针分配了一些空间。现在,如果我有另一个指针 ptr2 并这样做:

ptr2 = ptr;

这是我为ptr2分配空间还是需要我自己为ptr2分配空间?

【问题讨论】:

  • 如果可用答案之一解决了您的问题,您应该接受答案。

标签: c++ pointers memory-management


【解决方案1】:

好吧,这取决于您所说的“为指针分配空间”的意思。

例如:

int* ptr;

在自动内存中为指针分配空间。指针没有指向任何有意义的东西。如果你这样做了:

int* ptr = new int;

您在自动内存中为指针本身分配了空间,并且该指针指向由new int 分配的内存,该内存位于动态内存中。

如果你现在这样做了:

int* ptr2 = ptr;

您在ptr2 本身的自动内存中有一些内存,但它会指向与ptr 相同的动态内存位置

所以最后,您在自动存储中为 2 个int*s 分配了内存,在动态存储中为一个int 分配了内存。这两个指针指向同一个内存。

自动内存被自动清理(duuh)。您必须自己删除动态分配的内存:

delete ptr;

注意,由于两者指向同一个位置,所以:

delete ptr;
delete ptr2;

会产生未定义的行为(因此是非法的)。

(这都需要优化,但原则上,它会像这样下降)

【讨论】:

    【解决方案2】:

    您不会“为指针分配空间”。你只“分配空间”,然后你有一个指向该空间的指针。在您的情况下,您只需有两个指向同一空间的指针(ptrptr2)。

    【讨论】:

      【解决方案3】:

      指针类似于变量或 POD(普通的旧数据类型,例如 int),不同之处在于它保存了一个内存地址。您所做的只是将地址从一个变量复制/分配到另一个变量。

      【讨论】:

        【解决方案4】:

        指针就像一个简单的变量,不同之处在于它存储了一个内存地址。所以有两种空间分配需要考虑。一是指针变量本身占用的空间。第二个是指针指向的空间。正如问题所说,

        假设我有一个指针 ptr,我为该指针分配了一些空间

        我认为这是在谈论第二种情况。

        因此,当您执行 ptr2 = ptr 时,ptr2 指向的空间与 ptr 指向的空间相同。但是,是的,为 ptr2 分配了一些空间,它可以存储它指向的地址。

        【讨论】:

        • 指针也需要空间。请参阅 Luchian Grigore 的回答。
        • 好吧,正如他的回答所说,这取决于“为指针分配空间”的意思。这里需要考虑两个方面,无论您是在谈论存储指针的空间还是它指向的内存。
        • @shrey347 不管他所说的“为指针分配空间”是什么意思,你的第一句话“你实际上并没有为指针分配空间”是错误的,因为指针本身会占用空间。
        • 好吧,如果你从字面上理解,是的,这个陈述是错误的。从上下文来看,我认为不是。但是,是的,如果它传达了虚假信息,我会将其更改为有意义的内容。
        【解决方案5】:

        编译器为程序中引用的所有变量分配内存。假设指针是一种变量。

        因此,为 ptr1 和 ptr2 分配了内存:

        两个指针都指向NULL:

        ptr          ptr2 
        0x0        | 0x0
        

        每个指针都指向一个存储值的内存地址:

        ptr          ptr2
        0x0F032010 | 0x0C012A10
        

        ptr2 现在指向与 ptr 相同的值。 ptr2 指向的东西都丢失了。

        ptr          ptr2
        0x0F032010 | 0x0F032010
        

        为了回答您的问题,ptr2 = ptr 不会创建 ptr 指向的值的副本,它只是使变量 ptr2 能够访问与 ptr 相同的值。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-03
          • 1970-01-01
          • 2019-10-20
          • 2016-04-19
          • 1970-01-01
          相关资源
          最近更新 更多