在新/删除后,c ++如何知道在哪里指向内存?

时间:2013-08-14 18:55:42

标签: c++ pointers memory dynamic

我第二次读这本书:“C ++ primer plus”,有一件事引起了我的注意: http://imgur.com/K73bnK9

通常将内存表示为线性块(1),假设您分配了2个新的内存块,(2)中的“a”和“b”,然后删除(3)中的“a”。箭头是根据书/教程指向空闲内存的指针。现在这些是我的问题:

  • 你有2个可用内存指针还是只有一个?
  • 如果你只能有一个指针,并且指针指向阻止“a”(再次释放),那么如果你想分配更多的内存然后你在“a”中可用怎么办?

编辑: 我试图了解内存分配在幕后的确如何工作,所以我想更详细地了解当我输入时会发生什么:“int i = 0;”或“while(running)”。

2 个答案:

答案 0 :(得分:-1)

没有指向空闲内存的指针。最终,这由操作系统处理和控制。它本可以在此时将a使用的内存分配给另一个进程。

你可以拥有任意数量的指针(好吧,你可以拥有多少内存)。他们可以指出任何事情,无论他们是否指向使用过的记忆。

如果您尝试分配的内存超过操作系统提供的内存,则新内存将失败,从而导致异常(std::bad_alloc)。

答案 1 :(得分:-1)

动态内存分配的工作方式与您在问题中提供的内容有所不同。如果分别分配两个内存块,则它们不一定是彼此相邻的。如果你使用相同的new语句(例如struct或数组的一部分)分配它们,那么稍后只删除其中一个,那么它们将是相邻的,但这对于做。

查看new的语法:

int* a = new int;

new运算符实际上返回指向已分配内存的指针,并将其存储在指针a中。如果你调用它两次,你会得到两个不同的指向两个不同内存块的指针。

如果您正在使用数组进行分配,那么您将获得一个指向数组第一个元素的指针。但是,调用delete并没有摆脱指针,它摆脱了它所指向的东西。因此,如果您要删除a的第一个元素(而不是整个数组),那么尝试访问a处的内存会产生未定义的行为,但访问a[1]会很好。