Joo*_*nen 6 c++ boost new-operator make-shared
我第一次使用boost :: make_shared来创建共享指针指向的对象.主要是因为我们的代码太慢而且单个分配确实有助于提高性能.
在修复了一些内存泄漏"硬手动方式"后,我决定通过覆盖所有相关类的新操作符来实现一个简单的内存泄漏检测器,只是为了计算在我们的应用程序中的特定点仍然存活的对象.我之前已经多次实现过,并且惊讶地发现我的代码不再检测到任何对象.
我想我所要做的就是覆盖"placement new"而不是"normal"operator new,因为make_shared的boost网站文档中有以下内容:
"效果:分配存储器适合类型T的对象,并在其中通过放置新的表达新(PV)T()或新的(PV)构造一个对象T(标准::向前(参数)...) allocate_shared.使用a的副本来分配内存.如果抛出异常,则无效."
我的位置新也没有被调用.我写了一个小测试程序来重现行为:
#include <iostream>
using namespace std;
#include "boost/shared_ptr.hpp"
#include "boost/make_shared.hpp"
class Test
{
public:
Test() { cout << "Test::Test()" << endl; }
void* operator new (std::size_t size) throw (std::bad_alloc) {
cout << "Test new" << endl;
return malloc(size);
}
void* operator new (std::size_t size, const std::nothrow_t& nothrow_constant) throw() {
cout << "Test non-throwing new" << endl;
return malloc(size);
}
void* operator new (std::size_t size, void* ptr) throw() {
cout << "Test non-throwing placement new" << endl;
return malloc(size);
}
};
void* operator new (std::size_t size) throw (std::bad_alloc) {
cout << "Global new" << endl;
return malloc(size);
}
int main() {
cout << "..." << endl;
boost::shared_ptr<Test> t1(boost::make_shared<Test>());
cout << "..." << endl;
boost::shared_ptr<Test> t2(new Test());
cout << "..." << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中呈现以下输出:
...
Global new
Test::Test()
...
Test new
Test::Test()
Global new
...
Run Code Online (Sandbox Code Playgroud)
我期待在第3行输出上"测试非投掷新位置".您认为该行为应该是什么?你是否同意根据make_shared的文档,它应该调用我的Test类的placement new运算符?还是我误解了它?
我可以在本地复制boost实现,当然也可以添加对placement new运算符的调用.但是,这是否合适,还是会违反新布局的预期语义?
提前感谢您的时间和帮助.
作为其来源make_shared,它使用全局放置new运算符,而不是您的类提供的新运算符.
::new( pv ) T();
Run Code Online (Sandbox Code Playgroud)
不幸的是(至少在OS X上)(根据标准),您无法定义自己的全局放置新运算符.它似乎allocate_shared更符合您的需求.
编辑:
另一种方法是实际编写一个版本make_shared,使用类的贴图而不是全局贴图.它只有大约10行代码,只要您遵守原始代码的许可证就应该没问题.
| 归档时间: |
|
| 查看次数: |
1614 次 |
| 最近记录: |