功能中的内存泄漏,返回指针

Memory leak in function, that return pointer?

本文关键字:返回 指针 泄漏 内存 功能      更新时间:2023-10-16

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

#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更改为此区域。

那么,第一个分配部门发生了什么?我没有在任何一步中免费获得免费。但是当我观看记忆过程中使用的记忆时,我没有看到任何泄漏。

没有内存泄漏,因为:

  • std::vector<T>具有值类型语义:

    破坏容器。调用了元素的破坏者,并处理了使用的存储。请注意,如果这些元素是指示器,则指向对象不会被破坏。

    - std :: vector :: 〜vector,c 参考。

  • std::vector<T>与Value Type(在描述的情况下的int)一起使用,用作类型参数。

  • 所有使用的std::vector<T>实例(变量)都是自动

    在C 中,当执行到达声明位置时,自动变量的构造函数被调用。当它到达给定程序块的末端时,将调用驱动器(程序块被卷曲括号包围)。此功能通常用于管理资源分配和DealLocation ,例如打开然后自动关闭文件或释放内存。参见raii。

    - 自动变量:C,C ,Wikipedia。

回到问题:

在foo中,我为向量分配内存并为其创建指针(VEC2)。然后,我创建了第二个指针到该内存扇区(VEC1),并立即删除指针VEC2,因为函数foo已结束。在我在FOO中分配新的内存扇区并将指针VEC1分配给该区域的第二次迭代时。

那么,第一个分配部门发生了什么?我没有在任何步骤中免费获得免费。

首先,已发布的源代码中没有指针。"低级别"内存管理封装在std::vector<T>中。请参阅参考文献以查找详细信息:

  • 资源获取是初始化,wikipedia。
  • 复制构造函数,Wikipedia和返回值优化(RVO),Wikipedia。
  • 复制构造函数vector( const vector& other ); (5)(std :: vector :: vector,c 参考)。
  • 分配运算符vector& operator=( const vector& other ); (1)(std :: vector :: operator =,C 参考)。