这个问题涉及到拥有指针,使用指针,智能指针,向量和分配器。
我在代码架构方面有点迷惑。此外,如果这个问题已经有了答案,请原谅,但我到目前为止还没有找到令人满意的答案,请指点我。
我的问题是:
我在一个向量中存储了几个“东西”,同时有几个“消费者”需要这些“东西”。因此,我的第一次尝试如下:
std::vector<thing> i_am_the_owner_of_things;
thing* get_thing_for_consumer() {
// some thing-selection logic
return &i_am_the_owner_of_things[5]; // 5 is just an example
}
...
// somewhere else in the code:
class consumer {
consumer() {
m_thing = get_thing_for_consumer();
}
thing* m_thing;
};
在我的应用程序中,这是安全的,因为“things”在任何情况下都比“consumers”存在更长的时间。然而,在运行时可能会添加更多的“things”,这可能会成为一个问题,因为如果std::vector<thing> i_am_the_owner_of_things;
重新分配内存,所有thing* m_thing
指针将变为无效。解决这种情况的方法是存储指向“things”的唯一指针,而不是直接存储“things”,即如下所示:
std::vector<std::unique_ptr<thing>> i_am_the_owner_of_things;
thing* get_thing_for_consumer() {
// some thing-selection logic
return i_am_the_owner_of_things[5].get(); // 5 is just an example
}
...
// somewhere else in the code:
class consumer {
consumer() {
m_thing = get_thing_for_consumer();
}
thing* m_thing;
};
这里的缺点是“事物”之间的内存一致性丢失了。是否可以通过使用自定义分配器重新建立这种内存一致性?我想到了一种类似于分配器的东西,它总是为10个元素分配内存,并在需要时添加更多的10个元素大小的内存块。
例如:
最初:
v = ☐☐☐☐☐☐☐☐☐☐
更多元素:
v = ☐☐☐☐☐☐☐☐☐☐ ☐☐☐☐☐☐☐☐☐☐
再次:
v = ☐☐☐☐☐☐☐☐☐☐ ☐☐☐☐☐☐☐☐☐☐ ☐☐☐☐☐☐☐☐☐☐
使用这样的分配器,我甚至不必使用“事物”的std::unique_ptr
,因为在std::vector
重新分配内存时,已经存在的元素的内存地址不会改变。
作为替代方案,我只能考虑通过std::shared_ptr<thing> m_thing
来引用“消费者”中的“事物”,而不是当前的thing* m_thing
,但我认为这似乎是最糟糕的方法,因为“事物”不应拥有“消费者”,使用共享指针将创建共享所有权。
那么,分配器方法是否可行?如果是这样,如何实现?我必须自己实现分配器吗,还是已经存在这样的实现?
std::shared_ptr<>
,因为您实际上拥有共享所有权:只要其中一个消费者仍然存在,就不能删除“thing”。 - cmaster - reinstate monica