【问题标题】:De-allocating memory within loops在循环内取消分配内存
【发布时间】:2013-06-23 18:49:25
【问题描述】:

我正在阅读 MIT 的《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?

【问题讨论】:

    标签: c++ pointers memory-management


    【解决方案1】:

    我想知道为什么可以在每次迭代后删除“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;
    

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

    【讨论】:

    • @FreemanLou:它将值5分配给内存位置*x,即x的值是内存位置。取消引用 x(与 *)使您可以访问该位置。
    • @FreemanLou 如果y是一个普通对象(例如int),而yPtr是一个指向y的指针,那么*yPtry是一样的,即y = 5*yPtr = 5 相同。
    • @Rabenholz:但在上面的代码中 int* x 从未被取消引用。
    • @FreemanLou x*x = 5 行中被取消引用,第一部分*x 取消对x 的引用,这将其转换为语句其余部分的常规int
    • @FreemanLou 可能会让您感到困惑的一件事是声明 int *x = new int;。在这一行中,x 没有被取消引用,它被声明为指针。我更喜欢把它写成int* x = new int;,因为这样可以更清楚地表明变量类型是int*。但是,在该行之后,只要您键入 *x,变量 x 就会被取消引用。
    【解决方案2】:

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

    用于存储所述地址的变量无关紧要。它的价值已经改变,这就是delete所关心的;价值。

    【讨论】:

      猜你喜欢
      • 2017-05-03
      • 1970-01-01
      • 2013-05-06
      • 2016-09-05
      • 2019-03-31
      • 2012-01-01
      • 1970-01-01
      • 2017-10-10
      • 2015-08-10
      相关资源
      最近更新 更多