【问题标题】:Memory leak in function, that return pointer?函数中的内存泄漏,返回指针?
【发布时间】:2015-05-05 23:07:55
【问题描述】:

此代码是否存在潜在的内存泄漏问题?

#include <iostream>
#include <vector>

using namespace std;

vector<int> foo()
{
    vector<int> vec2;
    vec2.push_back(0);

    return vec2;
}

int main()
{
    vector<int> vec1;

    while(true)
    {
        vec1 = foo();   
    }

    return 0;
}

如果我使用返回数字的函数,例如int,则没有问题,因为我们从内存堆栈中复制值。但是如果我使用pointer(而且我认为编译器不会复制数组、向量和其他大型数据结构——它隐式地使用指针),情况就会改变。

foo 中,我为向量分配内存并创建指向它的指针vec2。然后,我创建第二个指向该内存扇区vec1 的指针并立即删除指针vec2,因为函数foo 已结束。

while 的第二次迭代中,我在foo 中分配了一个新的内存扇区,并将指针vec1 更改为该区域。

那么,第一个分配扇区发生了什么?我没有在任何步骤上让它免费。但是当我查看进程使用的内存时,我没有看到任何泄漏。

【问题讨论】:

  • “如果我知道,编译器不会复制数组、向量和其他大型数据结构——它隐式地使用指针”——好吧,你错了。也许您已经阅读了有关 Java 的内容并将其与 C++ 混为一谈。
  • foo 是向量还是函数?这不会使用 g++ 编译器编译为 c++ 代码
  • @masfo001 声明foo后缺少一组括号
  • 我在您的代码中看不到任何内存泄漏。我使用 valgrind 进行了测试。只需编辑 while 循环,使其不是无限的。

标签: c++ pointers memory-leaks


【解决方案1】:

没有内存泄漏,因为:

  • std::vector&lt;T&gt; 具有值类型语义:

    破坏容器。调用元素的析构函数并释放使用的存储空间。请注意,如果元素是指针,则指向的对象不会被销毁。

    -- std::vector::~vector, C++ reference.

  • std::vector&lt;T&gt; 与值类型(在所述情况下为int)一起用作类型参数。

  • 所有使用的std::vector&lt;T&gt; 实例(变量)都是自动

    在 C++ 中,自动变量的构造函数在执行到达声明处时被调用。析构函数在到达给定程序块的末尾时被调用(程序块用大括号括起来)。此功能通常用于管理资源分配和释放,例如打开然后自动关闭文件或释放内存。请参阅 RAII。

    -- Automatic variable: C, C++, Wikipedia.

回到问题:

在 foo 中,我为向量分配内存并创建指向它的指针 (vec2)。然后,我创建了指向该内存扇区(vec1)的第二个指针,并立即删除指针 vec2,因为函数 foo 已结束。在第二次迭代中,我在 foo 中分配新的内存扇区并将指针 vec1 更改为该区域。

那么,第一个分配扇区发生了什么?我没有在任何步骤中让它免费。

首先,贴出的源代码中没有指针。 “低级”内存管理封装在std::vector&lt;T&gt; 中。请参阅参考资料以查找详细信息:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    • 1970-01-01
    相关资源
    最近更新 更多