Если у меня есть функция, которая создает STL
Объект в стеке и добавляет их в стек. Например скажу я делаю std::pair
в стеке и добавить их в std::queue
это сделано в куче. Теперь, если я пропущу очередь за пределами функции, может ли другая функция, которая принимает очередь в качестве параметра, получить доступ к std::pair
объекты.
Зависит от нескольких факторов, которые вы не упоминаете.
Первое, что нужно проверить — копируете ли вы объект в очередь или копируете указатель на объект в очередь. Вот примеры каждого.
std::queue<A> copyQueue;
std::queue<A*> pointerQueue;
void addCopy(A a) {
copyQueue.add(a);
}
void addPointer(A a) {
pointerQueue.add(&a);
}
Если он хранит копии объектов, то все, у кого есть доступ к очереди, может получить доступ к этому объекту без проблем. Если он хранит указатели, это зависит от того, был ли восстановлен этот стек. Если кадровый стек не тронут, доступ к этой памяти будет нормальным. В противном случае значение будет мусором.
Юридический пример:
функция A
добавляет указатель на выделенный объект стека std::queue Q
, а затем проходит Q
функционировать B
, Так как функция A
еще не вернулся, функция B
может получить доступ к объекту в Q
без проблем.
Пример мусора:
функция A
добавляет указатель на выделенный объект стека std::queue Q
, а затем возвращает Q
к его вызывающей функции B
, Так как функция A
вернулся, функция B
будет получать мусор, если он пытается получить доступ к объекту в Q
,
Когда ты push
объект (std::pair
в вашем случае) в std::queue
он копируется из локальной области в queue
, Поэтому, когда локальный объект выходит из области видимости и удаляется, его копия в queue
остается в силе, пока сама очередь не будет удалена.
В качестве примечания предпочитаю emplace
над push
как это будет строить std::pair
на месте в queue
вместо копирования.
Да, потому что, когда вы «добавляете» объект из стека к объекту из кучи, вы делаете копию информации, находящейся в стеке, в «кучу».