2

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

所以,我的问题是:

  • 我应该在我的析构函数中做什么,以便当不再需要对象并因此被释放时,它的所有“子组件”也会被释放?(例如 2boost::array秒)

  • 您注意到上述方法有什么问题吗?


请让我知道您是否需要了解有关我的实施的任何其他信息...

4

4 回答 4

5

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

请记住,如果您new需要delete,同样使用new[]- delete[]。除非分配到一个std::unique_ptr.

如果您的MyClass对象本身是在堆上分配的new,那么您将不得不分配delete它们。

ps 如果你使用的是 C++11,你现在应该可以使用std::array了。


从您的新代码中,很明显,无论谁保留从 返回的列表getListOfObjects(),都需要delete在每个元素被销毁时调用它。它很可能是SomeOtherClass.

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


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

于 2013-01-21T07:36:59.640 回答
3

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

现在,如果你说你有泄漏,你显然在某个地方对内存管理不善,但它不在这里。


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

于 2013-01-21T07:42:33.383 回答
1

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

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

您也可以使用boost::shared_ptr<MyClass>而不是原始指针MyClass*

于 2013-01-21T07:46:45.720 回答
1

这听起来有点奇怪

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

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

于 2013-01-21T07:54:39.740 回答