【问题标题】: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);

标签: c++ c++11 memory memory-leaks c++builder


【解决方案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]
猜你喜欢
  • 1970-01-01
  • 2016-06-13
  • 2014-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
相关资源
最近更新 更多