【发布时间】:2015-05-04 18:54:01
【问题描述】:
这是一个由以下代码说明的两部分问题:
#include <memory>
#include <vector>
#include <boost/pool/object_pool.hpp>
struct Foo {
Foo(int i) : _i(i) {}
void* operator new(size_t) = delete; // ***
int _i;
};
using FooHandle = std::unique_ptr<Foo>;
struct Bar {
Foo* addFoo(int i)
{
Foo* ptr = new (_fooPool.malloc()) Foo(i); // 111
return FooHandle(ptr,
&boost::object_pool<Foo,
boost::default_user_allocator_new_delete>::destroy); // 222
}
boost::object_pool<Foo> _fooPool;
};
我正在努力确保
- Foo 类型的对象仅由 Bar 类型的对象分配和拥有,
- 它们存储在池中,并且
- 它们是通过唯一指针访问的。
使用 Visual Studio 编译器时遇到以下问题
如果我删除默认操作符 new(标有 *** 的行),则放置 new(标有 111 的行)不会编译。我做错了什么还是 VS 限制?
我想,为了在池中分配正确的 unique_ptr,我需要提供对池删除器的访问权限。标记为 222 的行是我的尝试。编译器也不接受它。什么是正确的语法?
【问题讨论】:
-
unique_ptr的自定义删除器必须声明为模板参数并在构造函数中使用(与shared_ptr不同);所以你需要像using FooHandle = std::unique_ptr<Foo, decltype( &boost::object_pool<Foo, boost::default_user_allocator_new_delete>::destroy )>这样的东西。 -
另外你的
addFoo函数需要返回一个FooHandle,而不是一个原始指针,否则一旦函数返回,对象就会被销毁。 -
谢谢乔纳森·波特。当然你是对的,addFoo 必须返回 FooHandle。我试图这样做,但在处理其他问题时失去了最后的润色。
标签: c++ c++11 boost visual-studio-2013 unique-ptr