为指针分配空间

时间:2012-10-23 17:09:28

标签: c++ pointers memory-management

假设我有一个指针ptr,我为该指针分配了一些空间。现在,如果我有另一个指针ptr2并执行此操作:

ptr2 = ptr;

这是否意味着我为ptr2分配空间,还是我需要自己分配ptr2

5 个答案:

答案 0 :(得分:4)

嗯,取决于“为指针分配空间”的含义。

例如:

int* ptr;

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

int* ptr = new int;

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

如果你现在做了:

int* ptr2 = ptr;

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

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

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

delete ptr;

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

delete ptr;
delete ptr2;

会不确定行为(因此是非法的)。

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

  

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

我认为这是第二种情况。

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

答案 3 :(得分:0)

指针类似于变量或POD(普通旧数据类型,例如int),区别在于它包含内存地址。您所做的只是将地址从一个变量复制/分配给另一个变量。

答案 4 :(得分:0)

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

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

两个指针都指向NULL:

ptr          ptr2 
0x0        | 0x0

每个指针指向存储值的存储器地址:

ptr          ptr2
0x0F032010 | 0x0C012A10

ptr2现在指向与ptr相同的值。无论ptr2指出什么都丢失了。

ptr          ptr2
0x0F032010 | 0x0F032010

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