【发布时间】:2012-04-03 20:50:06
【问题描述】:
我维护一个旧的 C++ 应用程序,它有很多类,如下所示:
class ClassWithALotOfVectors
{
std::vector<int> _vector1;
std::vector<int> _vector2;
// a lot of other vector datamembers go here
std::vector<double> _vectorN;
};
即 - 一种数据类型,其中成员为 double 或 int 向量。 问题是 - 这些向量永远不会同时填充 - 因此 当我们创建 100000 个 ClassWithALotOfVectors 实例时 - 内存使用量增加 尽管这些向量中只有 10% 正在使用中,但这个数字令人印象深刻。
所以我决定写一个小的“按需分配”向量类。
它是 std::vector 的包装器 - 内部向量仅在何时创建 第一次访问(使用两个 getter - ref() 和 const_ref() 方法)
当我用 compact_vector 替换 ClassWithALotOfVectors 类中的 std::vector 时 如下:
class ClassWithALotOfVectors2
{
compact_vector<int> _vector1;
compact_vector<int> _vector2;
compact_vector<double> _vectorN;
};
做了一些测试,结果很有希望 - 内存使用量下降了 戏剧性地,但突然发现应用程序没有释放内存 最后 - 内存消耗的增长速度比它慢得多 曾经是 - 但应用程序似乎没有释放内存 最后。
你能看看我对 compact_vector 的实现吗 看看你是否能发现内存管理有问题。
template <class T> class compact_vector
{
public:
compact_vector<T>()
:_data(NULL)
{
}
~compact_vector<T>()
{
clear();
}
compact_vector<T>(const compact_vector<T> & rhs)
:_data(NULL)
{
if (NULL != rhs._data)
{
_data = new std::vector<T>(*(rhs._data));
}
else
{
clear();
}
}
// assignment
//
compact_vector<T> & operator=(const compact_vector<T> & rhs)
{
if (this != &rhs)
{
clear();
if (NULL != rhs._data)
{
_data = new std::vector<T>(*rhs._data);
}
}
return *this;
}
compact_vector<T> & operator=(const std::vector<T> & rhs)
{
clear();
if (!rhs.empty())
{
_data = new std::vector<T>(rhs);
}
return *this;
}
const std::vector<T> & const_ref()
{
createInternal();
return *_data;
}
std::vector<T> & ref()
{
createInternal();
return *_data;
}
void clear()
{
if (NULL != _data)
{
_data->clear();
delete _data;
_data = NULL;
}
}
private:
void createInternal()
{
if (NULL == _data)
{
_data = new std::vector<T>();
}
}
private:
compact_vector<T>(const std::vector<T> & rhs)
{
}
compact_vector<T>(std::vector<T> & rhs)
{
}
compact_vector<T>(std::vector<T> rhs)
{
}
std::vector<T> * _data;
};
【问题讨论】:
-
您的
clear方法可以大大简化为delete _data; _data = 0; -
如果可能的话,你现在应该使用
nullptr,尽管NULL仍然可以。 -
@Peter 正如他们的常见问题解答所述,Code Review 用于工作代码。这个问题实际上是关于代码中的一个问题:存在内存泄漏。我觉得这里比较合适。
-
@R.MartinhoFernandes 是的,我现在明白了。我并不清楚快速浏览是否有问题。也许编辑问题以更清楚地表明正在寻求什么帮助。
标签: c++ memory-management stl vector