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

时间:2013-01-21 07:32:02

标签: c++ arrays memory-management boost destructor

好吧,我想这个问题可能听起来太傻了,但内存管理(特别是在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;
};

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

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::array s)

  • 上述方法是否有任何错误?


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

4 个答案:

答案 0 :(得分:5)

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

请记住,如果您new需要delete,与new[] - delete[]类似。除非分配给std::unique_ptr

如果您的MyClass个对象本身已在new的堆上分配,那么您必须delete个。{/ p>

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


从新代码中可以看出,无论谁保留从getListOfObjects()返回的列表,都需要在每个元素被销毁时调用delete。它可能是SomeOtherClass的析构函数。

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


如果doSth在其表示中是准确的,并确保MyClass的所有实例都获得delete d,那么从内存泄漏的角度来看,此代码似乎很好。

答案 1 :(得分:3)

我所看到的只是一个正确管理内存的类。 boost::array是普通旧数组的花哨包装器(boost::array<int,64> arrA只是int arrA[64],添加了一些方法,使其成为标准库算法的随机访问只读集合)并因此被分配作为对象的一部分。

现在如果你说你有泄漏,你显然在某个地方做了错误的记忆,但它不在这里。


在现代C ++中,避免自己编写删除的趋势,而不是专门的析构函数。鉴于上面的分配代码,Boost.Pointer Container可能是正确的工具。

答案 2 :(得分:1)

我看到的都是在堆栈上分配的。因此它们在析构函数中得到妥善管理并被删除。如果存在内存泄漏,可能是您正在调用new MyClass但不会释放它们。或其他地方。

正如我在编辑过的代码中看到的那样,有一个向量是否正在删除objects返回的SomeOtherClass::getListOfObjects项?

您也可以使用boost::shared_ptr<MyClass>代替原始指针MyClass*

答案 3 :(得分:1)

这听起来有点奇怪

  

我的主要课程(我正在创建数百万个实例   (希望自动删除,因为它们不再存在   使用)

如果你正在创建MyClass的实例并且没有使用某种智能指针来完成它,那么它们就不会被神奇地删除,你需要完成这项工作。