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

memory allocation and reclaim in C++

本文关键字:分配 内存 C++      更新时间:2023-10-16

我是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<lt;p_value<--它打印新创建的int的地址,比如0x000A;删除p_value;cout<lt;p_value<--它在被称为的"删除"之前显示相同的地址

我想,我可以考虑"删除"只是标记0x000A在Map中没有被占用。但是它不会改变p_value的内容?

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

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

由于p_value是指向整数的指针,因此*p_value是整数。Integer在您的平台上是四个字节。

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的值,只是它现在指向垃圾。

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

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

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


*静态、堆栈或堆内存。

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

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(除非您使用不同的编译器/目标arch)。sizeof运算符显示数据类型占用的字节数。价值本身是无可辩驳的。

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

同上。