BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #101204同步于 2021/9/14
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

new 了但是没有完全 new

ClSlaid
2021/9/14镜像同步26 回复
晚上写list的时候突然想到的... 如果我 new T[0]; 会发生甚么 稍微测试了一下发现不会 panic 或者 segfault,但是也不是空指针了 ```cpp size_t *z_u64 = nullptr; // z_u64 == 0x0 z_u64 = new size_t[0]; // z_u64 == somewhere on heap ```
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
RinChanNOW机器人#1 · 2021/9/14
我猜有地址但是没空间
ClSlaid机器人#2 · 2021/9/14
是有地址,valgrind 写入的时候报错(但是也可能是逆向源码静态分析出来的错误) 但是 c++ 堆上数组越界不会报 segfault 么 【 在 RinChanNOW 的大作中提到: 】 : 我猜有地址但是没空间 : -- : ............
plazum机器人#3 · 2021/9/14
@Name1e5s 曾经研究过这个问题:https://blog.name1e5s.com/ckdlp3ayp001fzo3u68ozgrl0/ 上述文章研究的是glibc的malloc,关于MSVC对此的处理,可以参考https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/reference/malloc -------- 尴尬了,原来楼主说的是new,不是malloc,上面的当我没说 -------- C++标准对此的说法应该是https://eel.is/c++draft/expr.new#9.sentence-4 -------- 19L给出了GCC的libstdc++中的实现,这里给出MSVC中的实现(Clang的libc++的实现和GCC的大同小异,可以参见https://github.com/llvm/llvm-project/blob/main/libcxx/src/new.cpp) (以下代码出自C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\crt\src\vcruntime\new_scalar.cpp,路径中的版本号可能因具体环境而不同)_CRT_SECURITYCRITICAL_ATTRIBUTE void* __CRTDECL operator new(size_t const size) { for (;;) { if (void* const block = malloc(size)) { return block; } if (_callnewh(size) == 0) { if (size == SIZE_MAX) { __scrt_throw_std_bad_array_new_length(); } else { __scrt_throw_std_bad_alloc(); } } // The new handler was successful; try to allocate again... } }
ClSlaid机器人#4 · 2021/9/14
一方面声明数组不能长度为0,一方面 new T[0] 也会给你兜着...这就是C++么... 【 在 plazum 的大作中提到: 】 : @Name1e5s 曾经研究过这个问题:https://blog.name1e5s.com/ckdlp3ayp001fzo3u68ozgrl0/ : 上述文章研究的是glibc的malloc,关于MSVC对此的处理,可以参考https://docs.microsoft.com/zh-cn/cpp/c-runtime-library/reference/malloc : ............
wj364952553机器人#5 · 2021/9/14
an array with no elements该怎么理解? 【 在 plazum (plazum) 的大作中提到: 】 : @Name1e5s 曾经研究过这个问题:https://blog.name1e5s.com/ckdlp3ayp001fzo3u68ozgrl0/ : 上述文章研究的是glibc的malloc[/url... : -------- : ...................
Lin12333机器人#6 · 2021/9/15
应该是new一个object数组再强转为T
Telephone机器人#7 · 2021/9/15
我看glibc手册的时候对C语言类似的这种行为也是不会报错的
plazum机器人#8 · 2021/9/15
因为new数组的大小是动态的,所以有可能出现0,但是声明数组的大小是常量表达式,所以你完全可以在编码的时候确保不为0,我是这么理解的 【 在 ClSlaid (IWhisper#73) 的大作中提到: 】 : 一方面声明数组不能长度为0,一方面 new T[0] 也会给你兜着...这就是C++么...
plazum机器人#9 · 2021/9/15
应该就是字面意思吧,拥有0个元素的数组 【 在 wj364952553 (小王) 的大作中提到: 】 : an array with no elements该怎么理解?