这个问题的灵感来自一个类似的问题:delete []如何“知道”操作数数组的大小?
我的问题略有不同: 是否可以通过编程方式确定C ++数组的大小?如果没有,为什么? 我见过的每个接受数组的函数也都需要一个整数参数来赋予它大小。但是正如链接的问题所指出的,delete[]必须知道要释放的内存大小。
考虑以下C ++代码:
int* arr = new int[256]; printf("Size of arr: %d\n", sizeof(arr)); 这将打印“ Size of arr: 4”,它只是指针的大小。拥有一些可以打印256的功能会很好,但是我认为C ++中不存在这样的功能。(再次,部分问题是为什么它不存在。)
澄清:我知道,如果我在堆栈而不是堆上声明了数组(即“ int arr[256];”),则sizeof运算符将返回1024(数组长度* sizeof(int))。 问题来源于stack overflow
delete []不知道分配的大小。但是,该知识驻留在运行时或操作系统的内存管理器中,这意味着编译器在编译期间不可用。而sizeof()不是一个真正的功能,它实际上是评价由编译器的常数,这是一件好事它不能用于动态分配数组,其大小在编译期间是不知道做。
另外,请考虑以下示例:
int *arr = new int[256]; int *p = &arr[100]; printf("Size: %d\n", sizeof(p)); 编译器将如何知道其大小p?问题的根源在于C和C ++中的数组不是一流的对象。它们会衰减为指针,编译器或程序本身无法知道指针是否指向分配的内存块的开头new,或单个对象或块中间的某个位置。由分配的内存new。
原因之一是C和C ++将内存管理留给了程序员和操作系统,这也是为什么它们没有垃圾回收的原因。实施new和delete不是C ++标准的一部分,因为C ++,就是要在各种不同的平台,它可以以非常不同的方式管理他们的记忆中。如果您正在为运行在最新Intel CPU上的Windows框编写文字处理器,则可以让C ++跟踪所有分配的数组及其大小,但是当编写在Windows XP上运行的嵌入式系统时,这可能是完全不可行的。 DSP。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。