内存泄露,请大神帮忙看下,该怎么解决
内存泄露,请大神帮忙看下
大家费心了,如果能指出错误,会补分,跪谢!
------解决思路----------------------
一般来说,如果有必要写一个深拷贝的拷贝构造函数,那很可能也需要重载赋值运算符
------解决思路----------------------
需要注意, 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。
引用传参不需要构造临时对象, 可以避免这个
//类定义
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。
引用传参不需要构造临时对象, 可以避免这个