功能中的内存泄漏,返回指针
Memory leak in function, that return pointer?
此代码是否具有潜在的内存泄漏问题?
#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 参考)。
- 在函数中返回无符号字符数组,但不返回指针
- 为什么需要返回指针来利用协方差?
- 野牛如何在解析树中返回指针
- 何时返回指针与返回对象的一般经验法则?
- 为什么使用 std::istream_iterator 构造函数返回指针
- 为什么我不能直接从返回指针的函数返回对指针的引用?
- 如何在不使用临时变量的情况下取消引用返回指针的函数的返回值?
- 为什么下面的代码段返回指针指向的值而不是指针的地址?
- 使用 map<char,strring> 的迭代器返回指针 map<char,strring>*
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 函数返回动态强制转换的指针,返回指针,就好像它根本没有被转换一样
- 从函数返回对指针的引用与返回指针相同?
- C++ 为什么访问数组中的元素会返回指针?
- 关于函数返回指针
- 返回指针或对私有成员的引用的替代方法
- 从函数返回指针
- 通过从当地的C风格阵列中返回指针来获取一个悬空的指针
- 我应该如何定义返回指针的函数?(引用指针与指针指针)
- 为什么C 模板功能不支持返回指针
- 返回指针的语句 - 解释它是如何工作的以及为什么