【问题标题】:memory allocation and reclaim in C++C++中的内存分配和回收
【发布时间】:2016-04-03 08:21:46
【问题描述】:

我是 C++ 新手,刚刚阅读了一些关于它的在线教程。我对指针中的实验结果很好奇。这是我的代码:

int *p_value;
sizeof(*p_value) <--- I expected 0 but it shows 4
p_value = new int;
sizeof(*p_value) <--- it shows 8, make sense
delete(p_value)
sizeof(*p_value) <--- I expect 0, but it shows 4 again...

更重要的是,我不明白为什么p_value在删除操作后指向同一个内存地址。有必要是真的吗?


感谢您指出我对运算符“sizeof”的误解。但这是我在问题中没有说得太清楚的事情。

这是另一个代码: int *p_value = 新的 int; cout

我想我可以考虑“删除”只是标记 0x000A 未在 Map 中占用,我猜。但是不会改变p_value的内容?

【问题讨论】:

  • 你确定你输入的所有sizeof()都是一样的吗?要返回 8,第二个应该是 sizeof(p_value)
  • @Bob__ 是对的,在您的机器中,整数似乎是 4 个字节。因此,第二个 sizeof 返回 8 的唯一方法是它是指针的大小,即 8 字节地址
  • @Bob__ 是的,我相信他打错了问题,可能是 sizeof(p_value)。我说你是对的:)
  • @FábioJunqueira 我相信你也是对的 ;) 评论已删除
  • 是的...我打错了... sizeof() 将返回 8 而不是 4... Orz

标签: c++


【解决方案1】:

上面sizeof(* ptr)返回的所有结果都为你提供了它所指向的类型的大小信息,特定于你的平台,特别是int的大小,即@987654323 @ 表示大小:4 字节或 32 位,因此 int 最多可以容纳 232 - 1-sign-bit 不同的数字。

您可以将返回的结果视为来自:sizeof(int) 的结果,无论您的int 的位置*,无论您是否释放动态分配的内存,无论是否使用delete,它都不会改变,事实是,正如@ForEveR 已经说过的那样,会使您的结果令人怀疑**。


*静态、堆栈或堆内存。

**在两个不同的平台上检查,结果是4,而不是8

【讨论】:

    【解决方案2】:

    你的结果不可能是真的。在bytes 中,您的所有案例都输出int 类型的size(并且sizeof(int) 由于程序运行而无法更改)。

    【讨论】:

      【解决方案3】:
      int *p_value;
      sizeof(*p_value) <--- I expected 0 but it shows 4
      

      *p_value 是一个整数,大小通常为 4 个字节,因此显示为 4。这也取决于编译器(C++ 标准仅提到它应该至少为 4 个字节)。我的测试返回 8。

      p_value = new int;
      sizeof(*p_value) <--- it shows 8, make sense
      

      如果上面显示 4,那么这个也应该显示 4(除非您使用不同的编译器/目标架构)。 sizeof 运算符显示数据类型占用的字节数。价值本身是无价的。

      delete(p_value)
      sizeof(*p_value) <--- I expect 0, but it shows 4 again...
      

      同上。

      【讨论】:

        【解决方案4】:

        我认为您缺少的关键是 sizeof 不是函数。它不像函数那样在运行时查看其参数的 value,而在编译时只查看其 type

        int *p_value;   
        sizeof(*p_value) <--- I expected 0 but it shows 4
        

        由于p_value 是一个指向整数的指针,所以*p_value 是一个整数。在您的平台上,整数是四个字节。

        p_value = new int;   
        sizeof(*p_value) <--- it shows 8, make sense
        

        这很奇怪。因为p_value 是一个指向整数的指针,所以*p_value 是一个整数。显然,整数在您的平台上是 8 个字节。

        delete(p_value)  
        sizeof(*p_value) <--- I expect 0, but it shows 4 again...
        

        为什么你期望 0?因为p_value 是一个指向整数的指针,所以p_value 是一个整数。所以它的大小是 4(或者一个整数在你的平台上占用的字节数)。 p_value = malloc (sizeof (*p_value)); 还能如何工作?

        更重要的是,我不明白为什么p_value在删除操作后指向同一个内存地址。有必要是真的吗?

        将变量的值传递给函数不会改变该变量的值。所以delete (p_value) 不会改变p_value 的值,只是它现在指向垃圾。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-29
          • 1970-01-01
          • 2013-05-06
          • 1970-01-01
          • 1970-01-01
          • 2014-10-25
          • 2010-12-11
          相关资源
          最近更新 更多