1

我正在第二次阅读这本书:“C++ 入门加”,有一件事引起了我的注意:http: //imgur.com/K73bnK9

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

  • 您有 2 个指向可用内存的指针还是只有一个?
  • 如果你只能有一个指针,并且指针指向块“a”(它又是空闲的),如果你想分配更多的内存,那么你在“a”中有可用的内存怎么办?

编辑:我试图了解内存分配在幕后的真正工作原理,所以我想更详细地了解当我键入时会发生什么:“int i=0;” 或“同时(运行)”。

4

2 回答 2

-1

动态内存分配的工作方式与您在问题中提出的方式略有不同。如果您分别分配两个内存块,它们不一定彼此相邻。如果您使用相同的new语句(例如作为 astruct或数组的一部分)分配它们,然后仅删除其中一个,那么它们将是相邻的,但这是一件非常奇怪的事情。

查看 的语法new

int* a = new int;

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

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

于 2013-08-14T19:04:35.453 回答
-1

没有指向释放内存的指针。最终,这是由操作系统处理和控制的。那时它可能已经将使用的内存分配a给另一个进程。

您可以拥有任意数量的指针(嗯,只要您有内存)。它们可以指向任何东西,无论它们是否指向已使用的内存。

如果您尝试分配的内存多于操作系统给您的内存,new 将失败,从而导致异常 ( std::bad_alloc)。

于 2013-08-14T19:02:20.487 回答