【发布时间】:2013-10-31 22:38:40
【问题描述】:
我有一个班级OpenGLRenderer,其中有一个班级成员mMemoryAllocator,即std::shared_ptr<MemoryAllocator>。我将内存分配器保留在 shared_ptr 中的原因是,即使下面返回的shared_ptr<Texture> 比它的创建者OpenGLRenderer 寿命更长,如果我按值捕获它,MemoryAllocator 实例仍然有效,因为它会增加 ref计数:
std::shared_ptr<Texture> OpenGLRenderer::CreateTexture(TextureType textureType, const std::vector<uint8_t>& textureData, uint32_t textureWidth, uint32_t textureHeight, TextureFormat textureFormat)
{
return std::shared_ptr<Texture>(mMemoryAllocator->AllocateObject<Texture>(
textureData, textureWidth, textureHeight,
textureFormat, textureType, mLogger),
[=](Texture* texture) {
mMemoryAllocator
->DeallocateObject<Texture>(texture);
});
}
...但是,它不起作用。如果OpenGLRenderer 在std::shared_ptr<Texture> 之前超出范围,std::shared_ptr<MemoryAllocator> 就会损坏,因此 lambda 表达式会变得疯狂。我做错了什么?
【问题讨论】:
-
提问时,尽可能让其他人轻松阅读您的代码。
标签: c++ memory-management c++11 lambda smart-pointers