【问题标题】:Corba IDL struct memory leakageCorba IDL 结构内存泄漏
【发布时间】:2014-02-03 13:21:37
【问题描述】:

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

在课堂上

【问题讨论】:

  • 什么是map?是Session的成员吗?
  • boost::unordered_map> map;

标签: c++ memory-leaks corba idl tao


【解决方案1】:

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)
  { }
  ...

【讨论】:

  • 谢谢。所以在课堂会话中,使用“UserContext* _sessionContext;”,我不应该显式地释放 _sessionContext。 IDL 生成类型的所有新实例最终都会被 ORB 释放,我们不应该清理它们
  • 我认为马丁是正确的,但这里似乎仍然有问题。 ORB 确实会释放您从函数返回的指针。但是您已经制作了这个指针的副本并将其放入地图中。如果你在 ORB 释放内存后尝试使用这个指针,很可能会发生不好的事情。
猜你喜欢
  • 1970-01-01
  • 2016-03-28
  • 2011-10-04
  • 1970-01-01
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多