0
class AClass
{
    // ...
}

~

class AnotherClass
{
    public:
        // ...
        void AMethod()
        {
            // ...
            AClass * ac = new AClass(); // Dynamic memory allocation here
            m_Objects.push_back(ac);
            // ...
        }
        // ...
    private:
        // ...
        std::vector<AClass *> m_Objects;
        // ...
}

我想向AClassvector添加新对象m_Objects
有没有其他方法可以在不进行动态内存分配的情况下做到这一点?

4

4 回答 4

4

这里有两件事导致动态内存分配:

  1. vector::push_back
  2. new AClass()

这是一个如何减少动态内存分配的想法。

第一步是调用m_Objects.reserve(N);构造AnotherClass函数,其中是您希望在任何给定时间保留N的最大对象数。AClass这保留了足够的内存来消除对动态分配的需求vector::push_back

第二步是使m_Objects包含对象而不是指针,即使其类型std::vector<AClass>而不是std::vector<AClass*>. new这允许您通过增长容器来跳过并直接创建新对象:

m_Objects.resize(m_Objects.size() + 1);

现在,添加新对象时不会有动态分配。

于 2011-01-06T23:17:02.617 回答
2

如果您的意思是“我可以在运行时创建新对象而不进行动态分配吗?” 那么答案是否定的。这就是动态分配。

如果您想通过提前批量创建它们来在立即需要它们之前创建它们,那么这是合理的。只需分配一个大数字,然后根据需要将它们从数组或向量中拉出。

于 2011-01-06T23:06:27.660 回答
1

只要m_Objects是 a vectorof pointers,除非您要存储指向自动(堆栈)变量的指针。但毫无疑问,这将是一个非常糟糕的主意。

于 2011-01-06T23:07:33.120 回答
1

在运行时分配对象只有两种方式:在堆上动态分配,在调用栈上分配。

通过递归调用函数并将这些堆栈对象添加到向量中,可以在函数块中实例化多个作为局部(自动)变量的对象。但我很确定这不是你真正想要的。

这意味着唯一的另一种方法是使用new动态创建新对象。

于 2011-01-06T23:15:13.420 回答