重载operator new,当size==0时的处理

cloudwu 2002-06-30 01:29:32
我很早以前写了一套内存分配的代码今天终于出问题了.
因为我没有在 operator new 里处理 size==0 的情况 :(
而 stl 里出现了 new(0).

真应该早点看 effctive c++ ;)

不过 effctive c++ 里简单的把 size==0 的情况当 size=1 处理.
当然这没有问题.

只是, 我觉得, 当需要分配 0 byte 的时候, 直接返回 NULL 似乎也没有错.
因为那个指针是不能写的呀.

请问, 如果我直接在请求 0 byte 时候, 返回 NULL, 有没有什么隐患呢?
...全文
89 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qxp 2002-06-30
  • 打赏
  • 举报
回复
我觉得你应该看看标准的new 的语义是怎么定义的,
你对size ==0 的处理,做的和他一样就行啦
LeeMaRS 2002-06-30
  • 打赏
  • 举报
回复
感觉应该没有错.
程序中应该会有判断申请到的是否是NULL的判断,是NULL一般都会报错的说.
pipi_jf 2002-06-30
  • 打赏
  • 举报
回复
gz
casho 2002-06-30
  • 打赏
  • 举报
回复
我觉得还是有问题呀,你的问题是不是一颗指针向一堆区一个地址,但地址所在的空间是不可用的,new是在堆区分配一块空间,0就是分配一块大小为0的空间,在delete的时候可能会出错。
cloudwu 2002-06-30
  • 打赏
  • 举报
回复
另外我一直不单单把null 当作指向空的语义来用.
经常作为一个可以指向任何东西的合法指针 :)

比如我求 class A 里 变量 a 的偏移, 就这么干

reinterept_cast<int>(&(static_cast<A*>(0)->a));
cloudwu 2002-06-30
  • 打赏
  • 举报
回复
是啊是啊 :)
我也觉得分配 0 字节的空间返回更接近语义.
所以一般实际操作把 alloc 0 等同于 alloc 1,
反正我自己写的小内存分配策略中, 最少要分配 16bytes

只不过, 我希望提高一点点效率, 节省一点点内存(可能意义不大)
所以希望直接返回 NULL 了事, 就怕日后出问题 :)
anrxhzh 2002-06-30
  • 打赏
  • 举报
回复
又接近玄学了:-)
null的含义是指向空;
operator new(0)的含义是指向实,实中有0字节。
cloudwu 2002-06-30
  • 打赏
  • 举报
回复
我觉得返回 NULL 并不表示分配失败. 真正失败应该抛异常才对.
分配 0 字节也不允许失败. 好象我上面碰到的 stl 的代码就分配了 0 字节.

anrxhzh 2002-06-30
  • 打赏
  • 举报
回复
我想不出什么隐患。不过从逻辑上讲,operator new 的职责是分配原始内存,即使是分配0字节的请求好像也没有理由失败,这有点像数据库系统中空和空值的区别。
krerix 2002-06-30
  • 打赏
  • 举报
回复
up!

cloudwu 2002-06-30
  • 打赏
  • 举报
回复
to casho(小学生)
operator delete 更是要处理 NULL 的情况. delete 0 是必须保证不能出错的

to LeeMaRS(小菜虎_水壶的仇人):
c++ 里是不用判断 new 的返回值的, new 碰到最终无法处理的情况,
应该抛出异常.

to qxp():
据 effective c++ 2nd 说, operator new(0) 应该返回一个合法指针.
NULL 可能不算? 如果不算的话, 这样处理, 在什么情况下会出问题?

to jinfeng_wang(一天只需(许)来一次):
new 不光是要 new (class) 的, 还可以简单的当 malloc 用.

stl 从来不直接 new (class), 而是用 allocater,
先分配出内存, 然后用 replace new 在上面构造.

我的代码很简单.

vector< vector<int> > a;
定义一个 2d int 数组.
a.resize(1);

在 VC6 , 你可以跟踪一下, 其中要调用两次 ::operator new
一次请求 16 bytes, 一次请求 0 bytes.

当然不同的 stl 实现是不同的, 我说的只保证在 VC6 的 stl 里.



69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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