Gotcha #62: Replacing Global New and Delete
Gotcha条款62:替换Global New和Global Delete
将operator new、operator delete、array new亦或array delete的标准global版本替换为自定制版本,这几乎从来都不是个好主意——即使C++标准允许你这么做。这些函数的标准版本一般都针对通用目的(general-purpose)之存储管理做了极大优化,而用户自定义的替代版本则不大会做得更好了。(然而,针对特定的类别或类别阶层体系采用(自定制的)成员函数形式的操作来定制其内存管理,则通常是合理的。)
如果operator new和operator 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++;
}

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

2109

被折叠的 条评论
为什么被折叠?



