如何判断一个指针指向的是一个对象或者是一个个数组?

lsldd
博客专家认证
2008-11-13 06:12:09
如何判断一个指针指向的是一个对象或者是一个个数组,以便于执行delete 操作;如

int *p1 = new int;
int *p1 = new int[10];

如果事先不知道p1,如何判断p1是上述哪种情况?

...全文
434 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxgamexx 2008-11-14
  • 打赏
  • 举报
回复
试试这个!!!!




int *p=new int;
int *pt=new int[100];

cout<<strlen((const char*)p)<<endl;
cout<<strlen((const char*)pt)<<endl;



lq651659889 2008-11-14
  • 打赏
  • 举报
回复
学习
publicbit 2008-11-14
  • 打赏
  • 举报
回复
int *p1 = new int;
int *p2 = new int[10];
delete [] p1;
delete [] p2;
这样都没有错!!!!!!delete会自动匹配好的.分给我!!!
qinqinhao 2008-11-14
  • 打赏
  • 举报
回复
ding
muyingchi 2008-11-14
  • 打赏
  • 举报
回复
建议如果要达到new[]的效果,可以使用vector,这样就能自动清除了。另外如果不可以使用vector,也可以自己写一个简单的小类型,来封装new[]和delete[],至于new,用stl的智能指针,删除就不需要你管了。
我是苦力 2008-11-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lsldd 的回复:]
引用 1 楼 zmlovelx 的回复:
用delete还是delete[] 这个要程序员自己判断的
如果事先不知道,那么这个释放资源的工作并不能由你来做,应该由写这个代码的人来释放.
所以这个问题不是问题.

这是一道面试题...虽然不知道正确答案,希望大家讨论一下...
[/Quote]

说不顶,面试官就是要你回答以上的话。
lann64 2008-11-14
  • 打赏
  • 举报
回复
别依赖在地址的前面放置了分配的空间大小。这个纯属编译器实现上的东西,换个编译器,你的程序就有可能出错。或者,编译器升级到新版本,你的程序就出bug了。
小人物- 2008-11-13
  • 打赏
  • 举报
回复
谁污染谁治理啦
overbai 2008-11-13
  • 打赏
  • 举报
回复
应该是编译器将内存分配的信息记录在分配的内存开始的某个信息表中.
Laura_li 2008-11-13
  • 打赏
  • 举报
回复
在不知道的前提下一般用delete[]比较安全的
因为delete和delete[]在一般情况下是相同的只有在动态分配的情况下必须用delete[]
如果你非得判断是数组的还是对象的
我觉得应该判断是否调用类的构造函数
phisherr 2008-11-13
  • 打赏
  • 举报
回复
参见effectiveC++
条款5:对应的new和delete要采用相同的形式
条款11: 为需要动态分配内存的类声明一个拷贝构造函数和一个赋值操作符 的最后一段话
Lnnu_lc 2008-11-13
  • 打赏
  • 举报
回复
呵呵,路过,有意思
Lnnu_lc 2008-11-13
  • 打赏
  • 举报
回复
呵呵,路过,有意思
phisherr 2008-11-13
  • 打赏
  • 举报
回复
int *p1 = new int;
int *p1 = new int[10];


如果是这样就应该统一写成

int *p1 = new int[1];
int *p1 = new int[10];
统一释放
delete[] p1;
phisherr 2008-11-13
  • 打赏
  • 举报
回复
如果用new[]分配就必须用delete[]释放,而不管到底有几个对象,哪怕只有一个
xhs_lh04 2008-11-13
  • 打赏
  • 举报
回复
这道面试题出的,只能用差劲两个字

free的时候根据不需要知道指针指向的是类还是结构还是数组
free只需要知道要释放的首地址即指向此地址的指针即可

当然这题如果是问你如何判断指针的类型

可以通过dynamic_cast如果转换成功就说明是那种类型
dynamic_cast < type-id > ( expression )

比如:
B *pb = new B;
D *pd2 = dynamic_cast<D *>(pb);
如果不是此类型转换返回空
在上例
可以判断pd2!=NULL来判断pb是不是D *类型
星羽 2008-11-13
  • 打赏
  • 举报
回复
编译器自己知道分配内存的大小,

元素个数 = 分配内存大小 / 元素类型大小

至于编译器如果知道分配内存的大小,在debug下,一般把这个大小记录在分配的内存前面一些附加信息里(各个编译器有不同的实现)

Longinc 2008-11-13
  • 打赏
  • 举报
回复
是不是多可以用delete[]?
cyj626 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yh4130a 的回复:]
申明是自己 释放也是自己...
所以没有判断这一说,都是自己清楚的...
[/Quote]up
人尽其材 2008-11-13
  • 打赏
  • 举报
回复
这么细微的差别---大家都很细心
加载更多回复(17)

64,682

社区成员

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

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