【发布时间】:2013-01-04 05:50:39
【问题描述】:
好的,我想这个问题听起来可能太傻了,但是内存管理(尤其是在 C/C++ 中)从来都不是我的强项,而且由于它通常不是一件引人注目的事情,所以我倾向于忽略它。所以,如果这一切听起来很愚蠢,请原谅我。然而,由于我目前的项目涉及大量数据和处理,内存消耗很容易在几秒钟内超过 2GB,这肯定会减慢整个过程,所以......是时候开始思考了解决方法。
所以,这是我的情况……
我的主体类(我正在创建数百万个实例(希望它们会自动删除,因为它们不再被使用),所以应该 this 是罪魁祸首)是(大致)这个:
class MyClass
{
public:
// My Constructors
MyClass ();
MyClass (std::string param);
// My Destructor (still empty)
virtual ~MyClass ();
// Some methods
void methodA(std::string moves);
void methodB();
//----------------------
// My Variables
//----------------------
boost::array<int,64> arrA;
boost::array<unsigned int,13> arrB;
unsigned int key;
boost::array<int,3> arrC;
int argA;
int argB;
};
这是(大致 - 实际代码已被更改)上述类的实例是如何创建的:
vector<MyClass*> SomeOtherClass::getListOfObjects()
{
vector<MyClass*> objects;
for (int i=0; i<MAX_OBJS; i++)
{
// Do some preparatory work
objects += new MyClass();
}
return objects;
}
下面是如何使用上述函数的结果:
void SomeOtherClass::doSth()
{
vector<MyClass*> objs = this->getListOfObjects();
int objsSize = objs.size();
for (int i=0; i<objsSize; i++)
{
MyClass* obj = objs[i];
// Do sth with obj
delete objs[i];
}
}
所以,我的问题是:
我应该在我的析构函数中做什么,以便当不再需要对象并因此被释放时,它的所有“子组件”也会被释放? (例如 2 个
boost::arrays)您注意到上述方法有什么问题吗?
如果您对我的实现还有其他需要了解的信息,请告诉我...
【问题讨论】:
-
"it's usually not a noticeable thing, I tend to overlook it."-- 有史以来最糟糕的态度。您熟悉delete关键字吗? -
你缺少复制/移动构造函数
-
您的班级没有要管理的内存。你在制作这些
MyClass对象中的多少? -
@Dr.Kameleon:我认为当前硬件上的任何当前内存分配器都无法达到这样的速度。更不用说这个对象至少有 336 个字节,所以 1 亿个是 33.6 GB,这不适合当今普通计算机上的内存。
-
您可能不需要指针向量(使用
vector<MyClass>代替),只是要小心,因为要复制的内容要多得多(通过引用传递它getListOfObjects而不是返回它,这在任何一种情况下都可能是个好主意)。
标签: c++ arrays memory-management boost destructor