2

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

ptr2 = ptr;

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

4

5 回答 5

4

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

例如:

int* ptr;

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

int* ptr = new int;

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

如果现在你做了:

int* ptr2 = ptr;

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

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

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

delete ptr;

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

delete ptr;
delete ptr2;

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

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

于 2012-10-23T17:13:03.643 回答
1

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

于 2012-10-23T17:11:08.723 回答
0

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

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

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

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

于 2012-10-23T17:12:29.917 回答
0

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

于 2012-10-23T17:12:43.917 回答
0

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

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

两个指针都指向 NULL:

ptr          ptr2 
0x0        | 0x0

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

ptr          ptr2
0x0F032010 | 0x0C012A10

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

ptr          ptr2
0x0F032010 | 0x0F032010

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

于 2012-10-23T17:52:02.610 回答