无聊讨论C++中数组的长度

Inhibitory 2010-10-06 05:31:21
int *ns = new int[10]; // 创建一个含有10整形元素的数组
delete[] ns; // 释放数组的内存空间.

在释放数组的内存空间时,使用delete[] ns,而不是delete[10] ns (指出数组的元素个数),这说明数组ns的长度在内部是已经确定了的,肯定可以通过某种手段取得。但是为什么系统不提供一种方式,让我们取得数组的长度呢?如函数调用int array_length(ns),这样可以容易的取得数组长度,在运用中也更容易防止数组越界操作:


// 这时太不需要硬记数组的长度,如把数组作为参数传给函数时,也不需要传数组的长度了,直接由系统提供的函数就可取得。
for (int i = 0; i < array_length(ns); ++i) {
std::cout << ns[i] << std::endl;
}
...全文
552 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmmsgwcpd 2011-09-09
  • 打赏
  • 举报
回复
系统给非配给数组的内存并不等于数组的长度,应为系统也不是万能的,它也需要探索。
它分配给内存的空间大小前提是要能够容乃这个数组,也许是正好等于数组的大小,也许是大于数组的大小,只有这样才能保证数组在内存中能正常实用和运行,所以系统也不知道数组真正的大小,直知道有内存block块可以存放它。
所以你想要的那种函数系统不会提供。
光宇广贞 2010-10-06
  • 打赏
  • 举报
回复
这个很容易理解,因为它不想让你知道,所以你就无论如何都没法知道。它不让你这么操作,你就无论如何都操作不了。
harderman 2010-10-06
  • 打赏
  • 举报
回复
由于环境不同,所以才没有封装这类的函数
vincent_1011 2010-10-06
  • 打赏
  • 举报
回复
好像没人答到点上。

其实在指针的前面有一个控制结构,里面存放了很多重要信息,包括大小。不过可能不同版本结构不一致,所以不开放吧。
科技完美生活 2010-10-06
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 thefirstz 的回复:]
如果这些都解决了,C++就像是java了
[/Quote]
顶你
lazy_2010 2010-10-06
  • 打赏
  • 举报
回复
其实,内存分配的内部应该是只保留了字节大小,没有保存数据结构的个数。

如果你使用 GlobalAlloc/LocalAlloc 就可以获取 GlobalSize/LocalSize
庄鱼 2010-10-06
  • 打赏
  • 举报
回复
没有必要,作为申请空间的人——程序员——理应知道所申请的空间大小。
编程序,最好不要直接依赖电脑在机上编程,而是先在纸上用伪码实现,这样做,不仅有文档,而且思路会更清晰,同时测试的方法也可以一并解决。
添加数组长度函数并不复杂,但与new方法一样,相应的函数也许要重载,不然,内存泄露将很难查出原因。
tangxianghenggood 2010-10-06
  • 打赏
  • 举报
回复
delete[] ns; ns执行数组首地址的指针,至于大小,编译器自动帮计算了
Corepy 2010-10-06
  • 打赏
  • 举报
回复
up!
Qyee 2010-10-06
  • 打赏
  • 举报
回复
这样实现好像很简单,也有效。楼主的思考精神值得学习,
根据自己的想法实现,岂不更好。
AlanBruce 2010-10-06
  • 打赏
  • 举报
回复
kankan ...
昵称很不好取 2010-10-06
  • 打赏
  • 举报
回复
如果这些都解决了,C++就像是java了
kingstarer 2010-10-06
  • 打赏
  • 举报
回复

HeapSize Function

Retrieves the size of a memory block allocated from a heap by the HeapAlloc or HeapReAlloc function.


SIZE_T WINAPI HeapSize(
__in HANDLE hHeap,
__in DWORD dwFlags,
__in LPCVOID lpMem
);


2010-10-06
  • 打赏
  • 举报
回复
要自动维护内存大小请使用容器……

定长数组可以用 boost::array,变长数组可以用 std::vector……

整天想着改语法不累么……
kingstarer 2010-10-06
  • 打赏
  • 举报
回复
各个编译器实现不一样 没有标准

不过各个编译器自己提供了获取长度的函数

RLib 2010-10-06
  • 打赏
  • 举报
回复
其实并没有真正释放吧,他是在堆里分配的,而这个堆必须在程序退出才能销毁的。
ithiker 2010-10-06
  • 打赏
  • 举报
回复
这样的功能我们可以自己定义:
#define array_length(ns) sizeof(ns)/(*ns)
系统不自己定义是为了避免将问题复杂化,保持简练和平台的可拓展性,C和C++在其它问题上也有类似的处理
FancyMouse 2010-10-06
  • 打赏
  • 举报
回复
runtime library只是分配了一块能够容纳那个数组的内存区域。这块区域的大小不等于数组实际占用的空间。delete只是调用析构函数+释放那内存。所以结论有二:

1. 那块内存本身并不存放数组多少长。
2. 释放内存时不需要知道数组多长。直接把块给释放了就完了。
dadacaishenye 2010-10-06
  • 打赏
  • 举报
回复
为一个数组申请存储空间时只返回了首存储地址的值,也就是说cs的值为申请数组首元素的地址,之所以指定数组的长度主要是供系统分配存储空间提供依据,程序员对数组的操作本质上是对地址空间的操作,所以数组长度并没有多少用处,基于数组长度的操作反而加大了系统的开支。
iambic 2010-10-06
  • 打赏
  • 举报
回复
因为在C语言设计之初,没想到程序员会有那么笨。

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧