循环中的内存释放问题

3
我正在阅读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?
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;

意思是“在你的手指所指的地方画数字5”。

1
@FreemanLou:它将值5赋给内存地址*x,即x具有一个内存地址。对x进行解引用(使用*)可以访问该位置。 - Ed S.
如果y是一个普通对象(例如int),而yPtr是指向y的指针,则*yPtry相同,即y = 5等同于*yPtr = 5。@FreemanLou - Elliot Hatch
@Rabenholz:但是在上面的代码中,int* x从未被解引用。 - Freeman Lou
*x = 5 这一行中,x 被解引用了,第一部分的 *x 解引用了 x,将其转换为常规的 int 类型以供语句的其他部分使用。 - Elliot Hatch
@FreemanLou 有可能让你感到困惑的是声明 int *x = new int;。在这一行中,x 并没有被解引用,而是被声明为指针。我更喜欢写成 int* x = new int;,因为这样更清楚地表明了变量类型是 int*。然而,在那一行之后,每当你键入 *x 时,变量 x 就会被解引用。 - Elliot Hatch

2

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

用来存储该地址的变量并不重要。它的 已经改变,这就是 delete 所关心的;值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接