如何在我的类析构函数中释放内存?

Dr.*_*eon 0 c++ arrays boost destructor memory-management

好吧,我想这个问题可能听起来太傻了,但内存管理(特别是在C/C++中)从来都不是我的强项,因为它通常不是一个值得注意的事情,我倾向于忽视它.所以,请原谅我,如果这一切听起来都很愚蠢.然而,由于我目前的项目涉及大量数据和处理,内存消耗在几秒钟内很容易超过2GB,这肯定会减慢整个事情的速度,所以...是时候我开始考虑如何修复它了.


所以,这是我的情况......

我的主要类(我正在创建数百万个实例(希望它们被自动删除,因为它们不再被使用),所以据说是罪魁祸首)是(大致)这个:

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;
};
Run Code Online (Sandbox Code Playgroud)

这是(粗略地 - 实际代码已被更改)如何创建上述类的实例:

vector<MyClass*> SomeOtherClass::getListOfObjects()
{   
    vector<MyClass*> objects;

    for (int i=0; i<MAX_OBJS; i++)
    {
          // Do some preparatory work
          objects += new MyClass();
    }

    return objects;
}
Run Code Online (Sandbox Code Playgroud)

以下是如何使用上述函数的结果:

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];
    }
}
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:

  • 我应该在析构函数中做什么,这样当不再需要对象并因此释放时,它的所有"子组件"也都被释放了?(例如2 boost::arrays)

  • 你注意到上面的方法有什么不对吗?


如果您需要了解我的实施情况,请告知我们......

Kar*_*k T 5

您的类成员看起来不是动态分配的,在这种情况下,您不需要delete在析构函数中显式地显示任何内容.如果你碰巧遗漏了一些指向已分配内存的指针,在你分配的这个问题中new,你需要delete在析构函数中使用这些内容.

请记住,如果你new需要delete,同样new[]- delete[].除非分配给一个std::unique_ptr.

如果您的MyClass对象本身是在堆上分配的new,那么您将不得不delete这样做.

如果您使用的是C++ 11,那么您std::array现在应该使用它.


从你的新代码中可以看出,任何保留列表的人都getListOfObjects()需要delete在每个元素被销毁时调用它们.它很可能是析构函数SomeOtherClass.

或者,您可以将MyClass*指针包装在一个std::unique_ptrstd::shared_ptr(或任何可能与此相关的boost智能指针)中,然后当持有它们的向量超出范围并被销毁时,它将自动删除.


如果doSth它的表示是准确的,并确保MyClassget deleted的所有实例,那么从内存泄漏的角度来看,这段代码看起来很好.

  • @ Dr.Kameleon您可能想要编辑问题以显示您分配和解除分配对象的代码以及向量的定义,并在那里添加这些详细信息 (2认同)