Вот сценарий, я наткнулся на: -функция C++ член в состоянии получить доступ к данным даже удалил объект, который назвал его
#include <iostream>
class Agent;
class State;
class OffState;
class OnState;
class State
{
public:
virtual void execute(Agent * agent) = 0;
virtual ~State() {std::cout << "removing State\n";}
};
class Agent{
State * currentState ;
public:
Agent();
void update(){
std::cout << "agent updating. will execute current State " << std::endl;
currentState->execute(this);
}
void changeState(State * newState){
delete currentState;
currentState = newState;
}
};
class OffState : public State
{
public:
~OffState() {std::cout << "deleting OffState Object" <<std::endl;}
void execute(Agent * agent){
std::cout << "Nothing happens in the off State " << std::endl;
}
};
class OnState : public State
{
static int count ;
int id;
public:
OnState(){
id = count;
count++;
}
~OnState() {std::cout << "removing OnState id :- " <id<<std::endl;}
void execute(Agent * agent){
std::cout << "OnState executing" << std::endl;
agent->changeState(new OffState());
std::cout << "executed after deleting OnState ? id:- " << id << std::endl;
}
};
int OnState::count = 0;
Agent::Agent():currentState(new OnState()){
}
main(){
Agent smith;
smith.update();
}
В этом текущее состояние Агента инициализируется к О государственных объектов. Доступ к этому объекту осуществляется с помощью метода update() в Agent. Это вызывает метод выполнения OnState. Теперь этот метод execute косвенно удаляет объект OnState, который его вызвал. Однако после этого управление возвращается к методу execute() в объекте OnState. Более того, он может печатать значение «id». Не следует удалять память из-за удаления currentState.
Или это случай, когда в некоторых случаях система может произойти сбой, а в некоторых случаях содержимое памяти не будет немедленно заполнено операционной системой.
Я думал, что определение функции не сохраняется в памяти, специфичной для экземпляров как таковых, но это не объясняет, как значение «id» все еще доступно.
Выходной код был: -
agent updating. will execute current State
OnState executing
removing OnState id :- 0
removing State
выполняется после удаления О государственных? id: - 0
С уважением.
«Агент» не определен нигде. Пожалуйста, опубликуйте [MCVE] (http://stackoverflow.com/help/mcve) –
видел его до конца :) – Roby
извините, добавлено сейчас. (паста пошла не так) – ameyask86