我是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的内容吗?
答案 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...
与上述相同。