0

我试图通过将空指针传递给一个函数来初始化它,然后调用new我为此目的创建了两个函数:

void Create1(int** temp)
{
    *temp = new int(10);
}

void Create2(int *temp)
{
    temp = new int(10);
}

int main()
{
    int *data_1 = NULL;
    int *data_2 = NULL;
    Create1(&data_1);
    Create2(data_2);
}

为什么 Create1 函数正确初始化 data_1 但 Create2 函数无法初始化 data_2 ?

4

4 回答 4

2

您需要通过引用传递以获得您正在寻找的行为:

void Create2(int * &temp)
{
    temp = new int(10);
}
于 2013-08-20T16:23:09.283 回答
1

create1 将一个指针传递给一个指针,因此当您推迟它时,您实际上是在分配给传递的指针,create2 将它分配给一个局部变量,该变量在功能块末尾超出范围,因此新操作在自由存储,没有人指向,从而造成内存泄漏,为了解决这个问题,传递一个指向 create2 "int* &temp" 的指针的引用,这样值实际上被分配给传递的指针

于 2013-08-20T16:24:35.193 回答
1

这是因为 Create1 接收到一个写入新指针值的位置,而 Create2 接收一个空指针,并且 Create2 内部的修改只修改用于保存该空指针的局部变量,而不会影响函数外部的任何内容。

于 2013-08-20T16:25:07.670 回答
1

因为在第二种情况下,您将指针的值传递给它。即使您更改其值,该更改也不会传递回调用者。你实际上是在复制它的价值。

在第一种情况下,您传递的是指针所在的地址。您正在向该位置写一些东西。当调用者运行时,它可以看到你放在那里的东西。你是在告诉它某物在哪里。该位置对调用者和被调用者都是通用的。

于 2013-08-20T16:25:37.333 回答