【发布时间】:2015-10-20 12:18:11
【问题描述】:
我有以下设置:
class Foo {
public:
Foo() {}
vector<BigObject*> mPointers;
};
class Bar {
public:
Foo *exposeSomeFoo() { return &mFoos[42]; }
private:
vector<Foo> mFoos;
vector<BigObject> mMemoryManaged;
};
我基本上是在尝试确保在我的代码中任何时候都不会有人意外使用 Foo ,因为它所暴露的 Bar 已超出范围。
但这显然是有问题的。如果我像上面那样公开指向Foo 的指针,一旦Bar 超出范围,它们就会变得无效。如果我改为使用Foo exposeSomeFoo(),那么一旦Bar 超出范围,mPointers 也会变得无效 - 如果mPointers 有很多元素,返回副本似乎是个坏主意!
我已经尝试通过创建一个私有复制构造函数来解决这个问题:
class Foo {
public:
Foo() {}
vector<BigObject*> mPointers;
private:
Foo(const Foo&);
};
但是当我尝试从Bar 中将Foo 插入mFoos 时出现错误。
必须有一个范式,在允许完全内存安全的同时仍然允许我公开这样的功能。如何将来自Bar 的复合对象公开给其他地方的代码,其内存由Bar 或至少在编译单元本身专门管理?
【问题讨论】:
-
可以使用shared_ptr的向量