如何在函数结束时有效释放向量内存? [关闭]

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&lt;std::vector&lt;std::pair&lt;int, int&gt;&gt;&gt; 还有:16 个向量对? 如果你想在函数结束时删除向量,不要动态分配它。我想你可能正在寻找std::vector&lt; std::pair&lt;int,int&gt; &gt; 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]

以上是关于如何在函数结束时有效释放向量内存? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使重新打开文档时有效的 Excel VBA 函数?

堆上的整数向量和释放内存

远程线程DLL注入, 如何释放DLL和结束DLL的线程

Qt窗口关闭时如何释放内存?

在函数中定义数组:float fltNum[10],该数组在内存中是如何被分配内存空间?何时被释放内存空间?c语言中

如何使 jqgrid 仅在我们搜索时有效(显示数据)?