Утечка памяти в структуре Corba IDL

У меня есть пример кода ниже. 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;

на уроке

1

Решение

Реализация servantI::login правильно по отношению к возвращаемое значение.

  • Нет утечки памяти, ORB очистит указатель, который вы здесь установили.
  • Если вы используете (местный) 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)
{ }
...
3

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

Других решений пока нет …

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