2

给定以下代码:

void Allocate(int *p)
{
    p = new int;
    *p++ = 2;
}

int main()
{
    int i = 10;
    Allocate(&i);
    std::cout << i << std::endl;
}

我对以下内容的含义有些迷惑:

*p++ = 2;

输出是10,我对为什么会出现这种情况的推理是这*p++是一个临时的,因此对它的任何分配都会在Allocate(int *p).

是这样吗?谢谢你的建议!

4

5 回答 5

4
  • 在输入 时Allocatep指向 函数i中的变量。main
  • 该变量的地址随后丢失并被替换为 new int.
  • 此 int 的值(未初始化,因此可以以任何形式开始)设置为 2。
  • p指针递增。
  • 函数此时Allocate返回,泄漏分配的 int。
  • i函数中的值main不变,因为Allocate没有修改它。
于 2013-05-31T03:25:42.433 回答
3
p = new int;

您正在分配p新的内存来指向而不是之前指向的内容。然后,您更改了这个新分配的内存,当函数结束时它会永远丢失,从而导致内存泄漏。如果删除分配行,它应该会导致输出 2。在这种情况下 ++ 什么也不做。它只是增加指针并返回旧值以取消引用。

于 2013-05-31T03:23:21.087 回答
3

当您将 i 的地址传递给 Allocate 时,会创建另一个(临时)指针,该指针指向 i 的地址(即通过指针传递)。然后该临时指针指向一个新位置(通过新 int)。因此 i 的值是单独存在的。

这是我画的蹩脚插图

于 2013-05-31T03:25:50.990 回答
2

一旦你进入Allocate,你分配p到 指向一个新的内存块,所以它不再指向i。然后您修改新的内存块(然后在方法返回时泄漏。)i不受影响,因为您在设置指向的内存单元之前已经移动了该指针。

于 2013-05-31T03:24:48.287 回答
0
void Allocate(int **p)
{
    *p = new int;
    **p = 2;
}


int main()
{
    int j = 10;
    int *i = &j;
    std::cout << i << std::endl;
    Allocate(&i);
    std::cout << i << std::endl;
}

输出为:10 2

您需要一个指向指针的指针来更改所指向位置的地址。

于 2013-05-31T17:13:12.680 回答