C ++中的内存分配和回收

时间:2015-12-29 12:37:23

标签: c++

我是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指向删除操作后的相同内存地址。有必要是真的吗?

感谢您指出我对运营商&#34; sizeof&#34;的误解。但在我的问题中,我没有说清楚这一点。

这是另一个代码:     int * p_value = new int;     cout&lt;&lt; p_value&lt; - 它打印新创建的int的地址,比如0x000A;     删除p_value;     cout&lt;&lt; p_value&lt; - 它在&#34;删除&#34;之前显示相同的地址。称为

我可以考虑&#34;删除&#34;我想,只是标记0x000A没有占用Map。但它不会改变p_value的内容吗?

4 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

我认为你遗漏的关键是public void killApp(String appPackage) { ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> activityes = ((ActivityManager) manager).getRunningAppProcesses(); for (int iCnt = 0; iCnt < activityes.size(); iCnt++) { if (activityes.get(iCnt).processName.contains(appPackage)) { try { Process rootProcess = Runtime.getRuntime().exec(new String[]{"su"}); String command = "kill - 9 " + activityes.get(iCnt).pid; BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(rootProcess.getOutputStream()), 2048); try { bw.write(command); bw.newLine(); bw.flush(); } catch (IOException e) { // Handle error } } catch (Exception e) { e.printStackTrace(); } } } } 不是一个功能。它不像运行时那样在运行时查看其参数的,只是在编译时它的类型

sizeof

由于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是一个整数。显然,你的平台上的整数是8个字节。

*p_value

为什么你期待0?由于delete(p_value) sizeof(*p_value) <--- I expect 0, but it shows 4 again... 是指向整数的指针,因此p_value是一个整数。所以它的大小是4(或者你的平台上整数占用的字节数)。 p_value怎么办?

  

更重要的是,我不明白为什么p_value指向删除操作后的相同内存地址。是否有必要成为现实?

将变量的值传递给函数并不会更改该变量的值。因此,p_value = malloc (sizeof (*p_value));不会更改delete (p_value)的值,除非它现在指向垃圾。

答案 2 :(得分:1)

上述sizeof(* ptr)返回的所有结果都会为您提供有关其所指明类型的大小,特定于您的平台的信息,特别是int的大小,即4表示大小:4个字节或32位,因此int最多可以容纳2个 32 - 1-sign-bit 个不同的数字。

您可以将返回的结果视为以下结果:sizeof(int),无论int是否释放动态分配的内存,delete的位置*都不会发生变化4 1}}或者不是,正如@ForEveR已经说过的那样,你的结果可疑**。

*静态,堆栈或堆内存。

**在两个不同的平台上检查,结果为8,而不是M Byte/sec

答案 3 :(得分:0)

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...

与上述相同。