释放包含多个向量的结构的内存

时间:2017-08-20 14:56:11

标签: c++ vector memory-management struct

有一个结构如:

struct PAIR {
    vector<double> a;
    vector<double> b;
};

在定义和填充这样的结构后,是否正在使用类似以下的函数来释放内存?如果没有,你如何处理这种情况?

void release(PAIR& p){
   vector<double>().swap(p.a);
   vector<double>().swap(p.b);
}

有没有办法在PAIR上调用一些预定义/ std函数来释放内存?

请注意,我没有使用new等,因此定义就像PAIR p;一样。此外,结构比仅使用std::pair定义的一对向量复杂得多。

  

关于向量释放内存的所有相关问题都是关于向量本身或结构的向量,不是包含多个向量的结构。我正在寻找一种优雅的方式来释放这种结构使用的内存。

上下文

矢量变得非常大,我想尽快释放内存。但是那个寿命/可用性达到了功能的中间!我不想将此功能中的功能扩展到多个功能。这些是非常复杂的计算,并且不想搞砸。

3 个答案:

答案 0 :(得分:2)

给定函数实际上不会释放堆栈中的内存 。它大致相当于

p.a.clear(); 
p.a.shrink_to_fit();

向量本身保留在内存中(只有0个元素)。

请记住,只有当占用此内存的变量超出范围而不是更早时,才会释放在堆栈上分配的任何内存(〜不使用new)。

因此,如果堆栈上有变量并想要删除它,则可以限制其范围:

struct PAIR {
    vector<double> a;
    vector<double> b;
};

int main()
{
  // some stuff before...
  {
     PAIR p;
     // some stuff with p object...
  } // here p gets deleted (all memory gets released)
  // some stuff after...
}

您提到了new PAIR。使用指针它看起来像这样:

int main()
{
   // some stuff before...
   PAIR* p = new PAIR;
   // some stuff with p object...
   delete p; // here p gets deleted (all memory gets released)
   // some stuff after...
}

或者评论员要求:

int main()
{
   // some stuff before...
   {
     auto p = std::make_unique<PAIR>();
     // some stuff with p...
   } // here p gets deleted (all memory gets released)
   // some stuff after...
}

这是你想要达到的目标吗?

答案 1 :(得分:0)

PAIR必须是POD吗?也许这样的事可能适合你?

struct PAIR
{
private:
    std::unique_ptr<std::vector<double>> aptr;
    std::unique_ptr<std::vector<double>> bptr;
    PAIR(const PAIR&) = delete;
public:
    PAIR() : aptr(std::make_unique<std::vector<double>()), 
             bptr(std::make_unique<std::vector<double>()) {}
    ~PAIR() { release(); }
    std::vector<double> &a = *aptr;
    std::vector<double> &b = *bptr;
    void release()
    {
        aptr.reset();
        bptr.reset();
    }
...
};

答案 2 :(得分:-1)

简单地SudokuCell(Context context) 向量。