Доступ к объектам стека вне функции

Если у меня есть функция, которая создает STL Объект в стеке и добавляет их в стек. Например скажу я делаю std::pair в стеке и добавить их в std::queue это сделано в куче. Теперь, если я пропущу очередь за пределами функции, может ли другая функция, которая принимает очередь в качестве параметра, получить доступ к std::pair объекты.

0

Решение

Зависит от нескольких факторов, которые вы не упоминаете.

Первое, что нужно проверить — копируете ли вы объект в очередь или копируете указатель на объект в очередь. Вот примеры каждого.

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,

2

Другие решения

Когда ты push объект (std::pair в вашем случае) в std::queue он копируется из локальной области в queue, Поэтому, когда локальный объект выходит из области видимости и удаляется, его копия в queue остается в силе, пока сама очередь не будет удалена.

В качестве примечания предпочитаю emplace над push как это будет строить std::pair на месте в queue вместо копирования.

1

Да, потому что, когда вы «добавляете» объект из стека к объекту из кучи, вы делаете копию информации, находящейся в стеке, в «кучу».

0
По вопросам рекламы [email protected]