昨天用placement new初始化从内存池申请的一块内存。晚上回家路上突然想到,从内存池申请下来忘了检查是否成功了,直接就new(ptr)了。以为这样会出core。不过转念一想new怎么也会检查下指针是不是为NULL吧。所以今天早上写了一段代码做了个实验,实验证明,placement new是会判断ptr是否为NULL的。如果是NULL,直接返回。
代码如下:
- #include <new>
- #include <iostream>
- class boo_t
- {
- public:
- boo_t():
- _a(0),
- _b(0)
- {
- }
- private:
- int _a;
- int _b;
- };
- int main(int argc, char *argv[])
- {
- void *buf = (void *)0;
- boo_t *a = new(buf) boo_t();
- std::cout<< "OK, get here and a is " << a << std::endl;
- return 0;
- }
如果placement new不做检测的话,那么就会出core,结果程序正常运行,输出结果:
如果将代码改为如下:
- #include <new>
- #include <iostream>
- class boo_t
- {
- public:
- boo_t():
- _a(0),
- _b(0)
- {
- }
- private:
- int _a;
- int _b;
- };
- int main(int argc, char *argv[])
- {
- void *buf = (void *)1;
- boo_t *a = new(buf) boo_t();
- std::cout<< "OK, get here and a is " << a << std::endl;
- return 0;
- }
只是将buf换为了1,但是同样是非法内存,这个破坏了NULL的检测,所以结果就是core dump。
通过以上就是想说,placement new简单的NULL检测还是有的,所以内存申请失败不要紧,放心大胆的用吧。new之后再检测也不晚。
阅读(2919) | 评论(0) | 转发(0) |