3

我正在阅读麻省理工学院的《C++ 简介》,其中一个代码示例显示:

int *getPtrToFive() {
    int *x = new int;
    *x = 5;
    return x;
}

int main() {
    int *p;
    for (int i = 0; i < 3; ++i) {
        p = getPtrToFive();
        cout << *p << endl;
        delete p;
    }
}

我想知道为什么可以在每次迭代后删除“p”,尽管“p”在循环开始之前被声明了一次并且没有使用“new”分配。

另一个问题是当“*x”在函数中被赋值为5时,因为它是一个指针,内存地址会被改变吗?所以它会像 0x00005 而不是实际值 5?

4

2 回答 2

6

我想知道为什么可以在每次迭代后删除“p”,尽管“p”在循环开始之前被声明了一次并且没有使用“new”分配

不,您不是在删除p,而是在删除p 指向的对象new,该对象是使用每次迭代分配的。

另一个问题是当“*x”在函数中被赋值为5时,因为它是一个指针,内存地址会被改变吗?所以它会像 0x00005 而不是实际值 5?

的值x将类似于 0xFFd00whatever。但是您正在打印 的值*x,即“内存中地址 0xFFd00whatever 处的数字”。您的代码中没有x=5;只有*x=5. 它的意思是“去x指向的地址,把数字5放在那里”。

你可以这样想:你有一只手,好吗?我们称它为“x”。命令

x = new int;

意思是“把你的手指指向你桌子上的某个空旷的地方”。在哪里

*x = 5;

意思是“在你的手指向的地方画出数字五”。

于 2013-06-23T18:51:45.267 回答
2

p只是类型的变量int*(指向 的指针int)。它的值是一个地址。当您为其分配新值时,它会指向一个新对象。 delete需要一个地址;这就是释放您分配的内存所需的全部内容。

用于存储所述地址的变量无关紧要。它的价值发生了变化,而这一切都delete在乎;价值。

于 2013-06-23T18:52:16.993 回答