C++进阶--placement new/delete
2024-08-22 06:06:37
//############################################################################
// Placement New 和 Placement Delete
// 标准的Operator new/delete:
void* operator new(std::size_t size) throw(std::bad_alloc);
void operator delete(void* pMemory) throw();
/*
* Placement new: 除了size_t param参数外,还带其他额外参数的operator new
* Placement delete: 除了void* param参数外,还带其他额外参数的operator delete
*
* 注意: 他们需要成对提供
*/
static void* operator new(size_t szie, void* pMemory) throw(bad_alloc);
static void* operator delete(void* pMemory, void* pMemory) throw();
/*
* STL中提供. 新创建的对象将放在pMemory位置.
*/
int function_A() {
int buffer[100000];
dog* pd = new(buffer) dog();
}
// 是否需要delete pd?
// 内存并不是在堆上分配,所以不需要释放,但是需要手动析构
// pd->Dog::~Dog(); //显式地调用析构函数
// 注意此析构方法,不能用于普通的在栈上分配的对象,否则离开作用域的时候会再析构一次
// 同样也不能用于普通的动态分配对象,只会析构,不会释放内存
class dog {
...
dog() { throw 20; }
static void* operator new(size_t szie, ostream& log) throw(bad_alloc){
log << "Customized new for dog.\n";
return ::operator new(size);
}
// static void* operator delete(void* pMemory, ostream& log) throw() {
// log << "Customized delete for dog.\n";
// free(pMemory);
// }
}
...
dog* pd = new(std::cout) dog();
最新文章
- 通过实战理解C语言精要——函数篇
- 数据库SQLite
- sql-schema与catalog
- 用C语言画一个“爱心”
- PHP 的snmp各个版本的Wrapper封装类
- 【linux】linux启动过程
- mysql5日期类型datetime查询范围值
- Centos7搭建集中式日志系统
- django celery的分布式异步之路(一) 起步
- linux dig 命令
- Ubuntu16.04系统安装搜狗输入法详细教程(转载)
- nat 共享上网软件
- Origin的使用问题集锦
- Entity Framework 学习
- 转---CentOS安装Oracle数据库详细介绍及常见问题汇总
- iOS - UITabBarController中的坑
- SYSBIOS学习笔记---线程(Threads)
- Mysql隔离级别 sql示例理解
- 【BZOJ2558】Count on a tree
- Centos 安装Dokuwiki