为什么不需要手动释放矢量?
Why don't vectors need to be manually freed?
我刚刚学习c++,来自对c和Java的理解。我不太明白为什么我写的一些代码没有泄漏内存。下面是代码:
// Foo.h
class Foo {
private:
std::vector<int> v;
public:
Foo();
virtual ~Foo();
void add_int(int);
}
// Foo.cpp
Foo::Foo(): v () {}
Foo::~Foo() {}
Foo::add_int(int x) {
v.append(x);
}
存储在v
中的向量显然在内部存储了一个指向堆分配内存的指针,需要释放,但我从未释放它。然而,Valgrind表示,使用这种代码根本不会泄漏。
秘密在于c++的析构函数。你写了一个"什么都不做"(~Foo
),但在c++中,当类被销毁时,成员变量会自动被销毁。
vector
的析构函数只是销毁每个包含的元素,然后释放它的内部数组。
您没有为new
动态分配v
,因此没有必要为delete
分配它。
c++保证在销毁Foo实例时自动销毁成员变量,并由vector处理自己的事务。
当vector对象被销毁时,vector类的析构函数将释放内存(当Foo对象被销毁时,vector对象本身也将被销毁)
因为你是在堆栈上分配vector的,所以当foo超出作用域时,它的所有堆栈变量的析构函数都会被自动调用。在vector对象上调用析构函数时,将调用vector对象中所有元素的析构函数。
如果你在堆上分配了向量,你就必须手动调用删除操作,或者更好的是,你可以使用智能指针来自动处理。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 为什么output_editor Concept不需要output_e迭代器标记
- 在除法中不需要四舍五入
- 与C代码相比,为什么C++代码不需要"#define _POSIX_C_SOURCE 200809L"?
- 将值从另一个数组写入数组,不包括不需要的值 C++
- C++ 写入路径名中包含不需要的空字符的文件
- 是否有必要获取锁并在不需要唤醒线程时通知condition_variable?
- 使用 assimp 加载模型 - 不需要提升?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 返回不需要的值的二叉搜索程序
- 当我不需要数据库中的所有值时,如何部分初始化 c++ 对象?
- C++:用户输入会产生不需要的行为
- 如何在不需要LIBCD.lib的情况下在Visual Studio 6中编译C项目
- 为什么python需要全局关键字而C/C++不需要?
- 将一个宏传递到另一个宏而不是直接传递内容时会出现不需要的额外"空"参数
- 为什么我们需要在 C++ 中检查空指针,而在 Java 中不需要?
- 为什么不需要手动释放矢量?
- 释放不需要的Q图像
- 如何为多个线程创建临时数组,而不需要不断地分配和释放