我对存储在堆栈上分配的列表容器以及在其他一些函数中访问存储的列表容器感到困惑。请建议将所有内容放在堆上是否更好?将所有内容放在堆上将需要在析构函数中进行更仔细的删除操作。
typedef (*func)(); // Callback type
class SignalHandler {
...
...
void Register(int, func);
void UnRegister(int, func);
public:
map<int, list<func> > mCallbackMap;
}
void SignalHandler::Register(int signal, func f){
....
list<func> l; // A new list
l.push_back(f); // insert f to the list
mCallbackMap.insert(make_pair(signal, l)); // Insert in map
....
....
....
}
在函数Register,列表l中,列表容器将在堆栈上分配。此容器将插入到地图中。由于容器是在堆栈上分配的,可以安全地访问存储在map中的列表容器中的其他一些功能吗?
例如:
void SignalHandler::UnRegister(int signal, func f) {
....
....
it = mCallbackMap.find(signal);
if (it != mCallbackMap.end()) {
list<func> *l = &(it->second); // Is it OK to access it here? I am confused.
}
}
先谢谢。
答案 0 :(得分:0)
STL容器遵循Value语义而不是Reference Semantics。因此,他们实际上创建了元素的内部副本并返回这些元素的副本。由于副本已创建,您应该没问题。