2014-02-03 3 views
1

У меня есть пример кода ниже. Метод ServantI.cpp: login, он создает новый UserContext. Перед возвратом контекста ему присваивается поле sessionContext нового сеанса, которое является UserContext *;Corba IDL struct memory leakage

//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. Он также сообщает о время выполнения unhandle исключения, если я изменю

 UserContext* _sessionContext; 

в

 UserContext_var _sessionContext; 

в классе сессии

+0

Что 'map'? Является ли он членом «сессии»? –

+0

boost :: unordered_map > map; –

ответ

3

Реализация servantI::login является правильным WRT. возвращаемое значение.

  • Утечка памяти отсутствует, ORB очистит указатель, который вы новичок здесь.
  • Если вы используете (местное) UserContext_var вам нужно использовать ._retn()

И WRT. карта и хранение userContext:

Вы не можете хранить новинку UserContext* context, как вы делаете в коде выше. Он будет уничтожен ORB, когда вы вернетесь из функции servantI::login. Если вам нужно сохранить его, сохраните копию UserContext - это простая структура значений в конце концов.

Session должно выглядеть:

class Session { 
    std::string _username; 
    UserContext _sessionContext; 
public: 
    Session(string name, UserContext const& context) 
    : _username(name) 
    , _sessionContext(context) 
    { } 
    ... 
+0

Спасибо. Поэтому в сеансе Class с «UserContext * _sessionContext;» я не должен явно указывать _sessionContext. Все новые экземпляры IDL сгенерированного типа были бы освобождены ORB, и мы не должны их очищать. –

+0

Я думаю, что Мартин прав, но все же здесь, кажется, что-то не так. Верно, что ORB освободит указатель, который вы вернетесь из функции. Но вы сделали копию этого указателя и положили его на карту. Если вы попытаетесь использовать этот указатель после того, как ORB освободит память, вероятно, произойдет что-то плохое. –

+0

@shijiexu - ответ обновлен –

Смежные вопросы