列出堆栈上的容器,并在其他函数中访问

list container on stack and accessed in other function

本文关键字:其他 函数 访问 堆栈      更新时间:2023-10-16

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

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 1中,列表容器将在堆栈上分配。这个容器被插入到映射中。由于容器是在堆栈上分配的,在其他函数中访问存储在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. 
    }
}

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