Я хотел бы воспользоваться следующей объявленной функцией boost::fast_pool_allocator
(см. документацию Boost для Буст-пул):
Например, у вас может быть ситуация, когда вы хотите выделить кучу небольших объектов в одной точке, а затем достичь точки в вашей программе, где ни один из них больше не нужен. Используя интерфейсы пула, вы можете запускать их деструкторы или просто забросить их в небытие...
(См. здесь за эту цитату)
Ключевая фраза: предать их забвению. Я не хочу вызывать деструкторы этих объектов.
(Причина в том, что у меня есть миллионы крошечных объектов, которые образуют чрезвычайно сложную сеть собственности в куче, и моей программе требуется около 20 минут, чтобы вызвать все деструкторы, когда единственный родительский объект уходит из стека. Я не нужно вызывать эти деструкторы, потому что нет желаемых побочных эффектов, и вся память содержится в boost::pool
.)
К сожалению, несмотря на обещание приведенной выше документации и обещание концепции boost::pool
, я не могу найти способ предотвратить вызов деструкторов управляемых объектов.
Проблема легко изолируется в небольшой программе-примере:
class Obj
{
public:
~Obj()
{
// Placing a breakpoint here indicates that this is *always* reached
// (except for the crash scenario discussed below)
int m = 0;
}
};
typedef std::map<int, Obj, std::less<int>,
boost::fast_pool_allocator<std::pair<int const, Obj>>>
fast_int_to_int_map;
class Foo
{
public:
~Foo()
{
// When the following line is uncommented, the program CRASHES
// when the destructor is exited - because the Obj destructors
// are called on the invalid Obj ghost instances
//boost::singleton_pool<boost::fast_pool_allocator_tag,
// sizeof(std::pair<int const, Obj>)>::purge_memory();
}
fast_int_to_int_map mmap;
};
void mfoo()
{
// When this function exits, the Foo instance goes off the stack
// and its destructor is called, in turn calling the destructors
// of the Obj instances - this is NOT desired!
Foo foo;
foo.mmap[0] = Obj();
foo.mmap[1] = Obj();
}
int main()
{
mfoo();
// The following line deallocates the memory of the pool just fine -
// but does nothing to prevent the destructors of the Obj instances
// from being called
boost::singleton_pool<boost::fast_pool_allocator_tag,
sizeof(std::pair<int const, Obj>)>::purge_memory();
}
Как отмечено в комментариях к коду, всегда вызываются деструкторы экземпляров Obj
, которыми управляет boost::pool
.
Что я могу сделать, чтобы многообещающая цитата из документа Boost Pool, drop them off into oblivion
, стала реальностью?