0

我对存储分配在堆栈上的列表容器以及在其他一些函数中访问存储的列表容器感到困惑。请建议将所有内容都放在堆上是否更好?将所有内容放在堆上将需要在析构函数中进行更仔细的删除操作。

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,list 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. 
    }
}

提前致谢。

4

1 回答 1

0

STL 容器遵循值语义而不是引用语义。因此,他们实际上创建了元素的内部副本并返回这些元素的副本。由于已创建副本,因此您应该没问题。

于 2013-05-17T02:04:09.310 回答