我第二次读这本书:“C ++ primer plus”,有一件事引起了我的注意: http://imgur.com/K73bnK9
通常将内存表示为线性块(1),假设您分配了2个新的内存块,(2)中的“a”和“b”,然后删除(3)中的“a”。箭头是根据书/教程指向空闲内存的指针。现在这些是我的问题:
编辑: 我试图了解内存分配在幕后的确如何工作,所以我想更详细地了解当我输入时会发生什么:“int i = 0;”或“while(running)”。
答案 0 :(得分:-1)
没有指向空闲内存的指针。最终,这由操作系统处理和控制。它本可以在此时将a
使用的内存分配给另一个进程。
你可以拥有任意数量的指针(好吧,你可以拥有多少内存)。他们可以指出任何事情,无论他们是否指向使用过的记忆。
如果您尝试分配的内存超过操作系统提供的内存,则新内存将失败,从而导致异常(std::bad_alloc
)。
答案 1 :(得分:-1)
动态内存分配的工作方式与您在问题中提供的内容有所不同。如果分别分配两个内存块,则它们不一定是彼此相邻的。如果你使用相同的new
语句(例如struct
或数组的一部分)分配它们,那么稍后只删除其中一个,那么它们将是相邻的,但这对于做。
查看new
的语法:
int* a = new int;
new
运算符实际上返回指向已分配内存的指针,并将其存储在指针a
中。如果你调用它两次,你会得到两个不同的指向两个不同内存块的指针。
如果您正在使用数组进行分配,那么您将获得一个指向数组第一个元素的指针。但是,调用delete
并没有摆脱指针,它摆脱了它所指向的东西。因此,如果您要删除a
的第一个元素(而不是整个数组),那么尝试访问a
处的内存会产生未定义的行为,但访问a[1]
会很好。