首先,我确实意识到这与 shared_ptr 的目的完全矛盾。我正在处理一些库代码,其中 ParticleSystem 的实例期望在构造期间将 shared_ptr 传递给它们以设置用于每个粒子的纹理。问题是,我已经以我的纹理拥有具体所有权的方式构建了我的程序的其余部分(如果这是正确的术语)——TextureCache 拥有所有纹理。所以我需要一种方法来使用这个 ParticleSystem 类,而不允许它删除我的纹理。如果我只是简单地创建一个新实例,ParticleSystem(std::shared_ptr<Texture>&myTexture)
那么它将尝试在纹理被破坏时破坏它(这是一个不需要且无效的操作,因为我的纹理甚至不是用new
.
我在这个问题上看到的最干净的方法是这样的:
- 在创建 ParticleSystem 的函数中创建一个包含纹理的 shared_ptr。
- 然后使用placement new,在与我刚刚创建的shared_ptr 相同的内存位置重建shared_ptr。现在纹理的引用计数为 2。
- 创建粒子系统。
- 让 shared_ptr 超出范围。因为它是在堆栈上分配的,所以它的解构器将被调用,并且它只会将引用计数减 1。因此,对象的引用计数将始终比实际值大 1,因此它永远不会被自动销毁。
我相信这个解决方案是合理的,但它仍然令人难以置信的骇人听闻。有没有更好的方法来解决我的问题?