如何在函数结束时有效释放向量内存? [关闭]
Posted
技术标签:
【中文标题】如何在函数结束时有效释放向量内存? [关闭]【英文标题】:How do I effectively release vector memory at the end of the function? [closed] 【发布时间】:2017-10-16 09:52:28 【问题描述】:在我的代码中,我定义了一个数组:
std::vector< std::pair<int,int> > *line_sep=new std::vector< std::pair<int,int> > [16];
在我的测试中,当我使用delete []line_sep;
时,我发现我的计算机内存使用量正在缓慢上升。
我只想释放 line_sep 内存。
16 个向量对!.. 经验
std::vector< std::pair<int,int> > *line_sep=new std::vector< std::pair<int,int> > [16];
for(int i=0;i<16;i++)
for(int j=0;j<1700;j++)
if(....)line_sep[i].push_back(Begin,End);
fun(line_sep);
delete []line_sep;
【问题讨论】:
内存使用缓慢上升意味着您没有删除所有内容。 只需使用std::vector<std::vector<std::pair<int, int>>>
。
还有:16 个向量对?
如果你想在函数结束时删除向量,不要动态分配它。我想你可能正在寻找std::vector< std::pair<int,int> > line_sep(16);
请提供minimal reproducible example
【参考方案1】:
是的,您可以使用delete[] line_sep;
来释放它。你用new[]
分配的任何东西都必须用delete[]
释放。
但是,最好使用另一个 std::vector
而不是使用原始指针:
typedef std::pair<int, int> IntPair;
typedef std::vector<IntPair> IntPairVec;
std::vector<IntPairVec> line_sep(16);
for(int i = 0; i < 16; ++i)
for(int j = 0; j <1700; ++j)
if (....)
line_sep[i].push_back(std::make_pair(Begin, End));
fun(&line_sep[0]);
或者,在 C++11 及更高版本中,std::unique_ptr
也可以工作:
using IntPair = std::pair<int,int>;
using IntPairVec = std::vector<IntPair>;
std::unique_ptr<IntPairVec[]> line_sep(new IntPairVec[16]);
for(int i = 0; i < 16; ++i)
for(int j = 0; j <1700; ++j)
if (....)
line_sep[i].push_back(Begin, End);
fun(line_sep.get());
【讨论】:
我明白了,谢谢你的帮助 如果您坚持不将line_sep
放入堆栈,那才是正确的解决方案。但是由于std::vector
比较小,可以直接写IntPairVec line_sep[16]
。以上是关于如何在函数结束时有效释放向量内存? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章