在循环中取消分配内存

时间:2013-06-23 18:49:25

标签: c++ pointers memory-management

我正在阅读麻省理工学院的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?

2 个答案:

答案 0 :(得分: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;

表示“画出你手指向的五号”。

答案 1 :(得分:2)

p只是int*类型的变量(指向int的指针)。它的价值是一个地址。为其分配新值时,它指向一个新对象。 delete期待一个地址;这就是解除分配内存所需的全部内容。

用于存储所述地址的变量无关紧要。它的已经改变了,而且delete都关心了;价值。