C++ Gotchas 条款62:替换Global New和Global Delete

博客主要讨论了C++中替换和重载Global New和Global Delete的相关问题。指出替换标准版本通常不是好主意,可能引入臭虫,比较安全的是重载。还介绍了placement new和显式析构操作,以及不同operator new对应不同operator delete,建议仅在必要时采用复杂方案。

Gotcha #62: Replacing Global New and Delete

Gotcha条款62:替换Global NewGlobal Delete

 

operator newoperator deletearray new亦或array delete的标准global版本替换为自定制版本,这几乎从来都不是个好主意——即使C++标准允许你这么做。这些函数的标准版本一般都针对通用目的(general-purpose)之存储管理做了极大优化,而用户自定义的替代版本则不大会做得更好了。(然而,针对特定的类别或类别阶层体系采用(自定制的)成员函数形式的操作来定制其内存管理,则通常是合理的。)

 

如果operator newoperator delete针对特定目的之实现版本作出了与标准版本相异的行为,其就可能引入臭虫,因为许多标准程序库和第三方程序库的正确性皆依赖于这些函数缺省的标准实现版本。

 

比较安全的方案是对global版本的operator new等函数进行重载,而不是替代它们。假设我们要以特定的字符样式(character pattern)填充新分配的存储空间:

 

void *operator new( size_t n, const string &pat ) {

  char *p = static_cast<char *>(::operator new( n ));

  const char *pattern = pat.c_str();

  if( !pattern || !pattern[0] )

    pattern = "/0"; // note: two null chars

  const char *f = pattern;

  for( int i = 0; i < n; ++i ) {

    if( !*f )

      f = pattern;

    p[i] = *f++;

  }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值