有一个结构如:
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
定义的一对向量复杂得多。
关于向量释放内存的所有相关问题都是关于向量本身或结构的向量,不是包含多个向量的结构。我正在寻找一种优雅的方式来释放这种结构使用的内存。
上下文
矢量变得非常大,我想尽快释放内存。但是那个寿命/可用性达到了功能的中间!我不想将此功能中的功能扩展到多个功能。这些是非常复杂的计算,并且不想搞砸。
答案 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)
向量。