内存泄露,请大神帮忙看下,该怎么解决

内存泄露,请大神帮忙看下


//类定义
class t_satObs {
 public:
  t_satObs() {}
  t_satObs(const t_satObs& old) { // copy constructor (deep copy)
    _staID = old._staID;
    _prn   = old._prn;
    _time  = old._time;
    for (unsigned ii = 0; ii < old._obs.size(); ii++) {
      _obs.push_back(new t_frqObs(*old._obs[ii]));
    }
  }
  ~t_satObs() {for (unsigned ii = 0; ii < _obs.size(); ii++) delete _obs[ii];}

  std::string            _staID;
  t_prn                  _prn;
  bncTime                _time;
  std::vector<t_frqObs*> _obs;
};
//出现问题的循环,如果加上这段代码,内存总是一直增加,可是没有发现什么问题呀!
while(true)
{
   if (_rnx)
{
long iSec    = long(floor(obs._time.gpssec()+0.5));
if (_rnx->samplingRate() == 0 || iSec % _rnx->samplingRate() == 0)
{
_rnx->deepCopy(obs);
}
_rnx->dumpEpoch(format, obs._time);
}

//调用的函数
void deepCopy(t_satObs obs) {
  _obs.push_back(obs);  //_obs为_rnx成员变量,定义:QList<t_satObs> _obs;
}
void dumpEpoch(const QByteArray& format, const bncTime& maxTime) {
  QList<t_satObs> obsList;
  QMutableListIterator<t_satObs> mIt(_obs);
  while (mIt.hasNext()) {
    t_satObs obs = mIt.next();
    if (obs._time < maxTime) {
      obsList.push_back(obs);
  mIt.remove();
    }
  }
}

大家费心了,如果能指出错误,会补分,跪谢!
------解决思路----------------------
一般来说,如果有必要写一个深拷贝的拷贝构造函数,那很可能也需要重载赋值运算符
------解决思路----------------------
需要注意, delete后内存不一定就会"还给系统" 就是让你看到内存减少.  这些内存可能会被缓存, 以提高下次new时提高速度.

当然, 你可以这样做, 来排除是否真的有没delete的对象.

定义一个全局变量, 
int  g_objCount=0;
然后在类t_satObs的构造函数(全部构造函数) 中  ++g_objCount;
析构函数中   --g_objCount;
最后看这个全局变量如果不为0,则是"可能"有内存泄漏了.
------解决思路----------------------
用shared_pt,就不用释放了
------解决思路----------------------
虽然看不怎么懂  但是我觉得可以定义一个static静态变量并单步执行  每次调用构造函数static+1并打印信息  每次调用析构函数则static-1并打印信息  
------解决思路----------------------
void deepCopy(t_satObs obs) {
  _obs.push_back(obs);  //_obs为_rnx成员变量,定义:QList<t_satObs> _obs;
}
将形参改为引用void deepCopy(t_satObs &obs) 试试看。 在下面的代码中:
if (_rnx->samplingRate() == 0 
------解决思路----------------------
 iSec % _rnx->samplingRate() == 0)
        {
            _rnx->deepCopy(obs);
        }
 _rnx->deepCopy(obs); 传入obs作为实参, 每次会构造一个临时对象传进去。 在copy constructor 中
t_satObs(const t_satObs& old) { // copy constructor (deep copy)
    _staID = old._staID;
    _prn   = old._prn;
    _time  = old._time;
    for (unsigned ii = 0; ii < old._obs.size(); ii++) {
      _obs.push_back(new t_frqObs(*old._obs[ii]));
    }
  }
_obs.push_back(new t_frqObs(*old._obs[ii])); 每次构造临时对象会new t_frqObs(*old._obs[ii])); 这样作为实参的临时对象没有delete。 
引用传参不需要构造临时对象, 可以避免这个