1

我有下面的示例代码。ServantI.cpp:login 方法,它构造了一个New UserContext。在context返回之前,赋值给new Session的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;

在课堂上

4

1 回答 1

3

的实施servantI::login是正确的。返回值。

  • 没有内存泄漏,ORB 将清理您在此处新建的指针。
  • 如果您使用(本地)UserContext_var,则需要使用._retn()

并且写。userContext的地图和存储:

不能UserContext* context像在上面的代码中那样存储新的。servantI::login当您从函数返回时,它将被 ORB 销毁。如果您需要存储它,请存储一个副本UserContext——毕竟它是一个简单的值结构。

会话应该看起来:

class Session {
  std::string _username;
  UserContext _sessionContext;
public:
  Session(string name, UserContext const& context)
  : _username(name)
  , _sessionContext(context)
  { }
  ...
于 2014-02-03T13:43:51.487 回答