У меня есть пример кода ниже. ServantI.cpp: метод входа в систему, он создает новый UserContext. Перед возвратом контекста он присваивается полю сеанса sessionContext нового сеанса, которое является UserContext *;
//idl:
struct UserContext{
string name;
string ipaddress;
string ssoToken;
};
UserContext login(in string name, in string cipher) raises (AuthenticationException);
void logout(in string name);// servantI.cpp
::project::UserContext * servantI::login (
const char * name,
const char * cipher)
{
project::UserContext* context = new UserConytext(); ...
boost::shared_ptr<Session> session(new Session(name, context));
map.addSession(name, session);
return context;
}
void servantI::logout (const char * name)
{
map.remove(name);
}
//Session.h:
class Session
{
std::string _username;
UserContext* _sessionContext;
public:
Session(string name, UserContext* context){ _sessionContext = context; ..}
virtual ~Session(void){
cout<<"Call descrutction "<<endl;
}
}
Мой вопрос заключается в том, есть ли утечка памяти в классе сеанса, так как есть место для освобождения указателя _sessionContext. Это также отчет об исключительной ситуации во время выполнения, если я изменю
UserContext* _sessionContext;
в
UserContext_var _sessionContext;
на уроке
Реализация servantI::login
правильно по отношению к возвращаемое значение.
UserContext_var
вам нужно использовать ._retn()
И относительно карта и хранение userContext:
Вы не могу хранить новые UserContext* context
как вы делаете в коде выше. Он будет уничтожен ОРБ, когда вы вернетесь из servantI::login
функция. Если вам нужно сохранить его, сохраните копию UserContext
— это простая структура ценностей в конце концов.
Сессия должна выглядеть так:
class Session {
std::string _username;
UserContext _sessionContext;
public:
Session(string name, UserContext const& context)
: _username(name)
, _sessionContext(context)
{ }
...
Других решений пока нет …