面向对象向量的c++内存管理
C++ Memory management for vector of Objects
我有一些关于内存管理如何为向量工作的问题/例子。
vector<int> vec1(10);
vector<int> vec2(10);
vec1 = vec2;
在这种情况下,vec1的旧内存现在是不可访问的。这里是否仍然存在内存泄漏,或者vec2的旧内存会意识到没有引用它并被清理?在另一个例子中
struct foo
{
vector<int> foo_vec(50);
int* arr;
}
void myFunction()
{
vector<foo> vec(10);
vec[0].arr = new int[50];
vec.erase(vec.begin());
}
由于我在第一个包含arr的vector元素上使用了erase()
,那么erase()
是否会释放该内存,或者我是否需要在擦除之前手动释放该内存?当vec
超出范围时,vec
中的所有foo_vec
向量都自动清理吗?谢谢你的帮助。
vector<int> vec1(10);
vector<int> vec2(10);
vec1 = vec2;
vec1先前的内容被擦除,因为int
只是一个POD。如果vector
由指向对象的指针而不是int型组成,并且这些指针由new
分配,则必须在分配之前删除这些指针指向的内容,否则将导致第二个示例所示的内存泄漏:
vector<foo> vec(10);
vec[0].arr = new int[50];
vec.erase(vec.begin()); // this will *not* call delete on vec[0].arr
通常,为了让事情变得简单,你可以使用智能指针,比如唯一指针(或者boost::shared_array/scoped_array)。当vector超出作用域或擦除vector时,将自动调用delete(或delete[])。
struct foo
{
std::vector<int> foo_vec(50);
std::unique_ptr<int[]> arr;
}
...
vec[0].arr.reset(new int[50]);
vec[0].arr[12] = 42;
...
vec.erase(vec.begin()); // this will call delete[] on vec[0].arr
erase()释放内存吗?还是我需要在擦除之前手动释放内存?
规则:对于每个new
,总是使用delete
. vector
不是魔法-它不知道你是如何获得指针的,所以它不会删除它,你需要这样做。
当vec超出范围时,vec中的所有foo_vec向量都自动清理了吗?
是的,它们的析构函数被调用,它们被释放。但是,如果析构函数不执行delete[] arr;
.
顺便提一句:你的代码违反了封装。应该分别分配(new
)和释放(delete[]
)析构函数和构造函数(foo::foo()
和foo::~foo()
)中foo::arr
所指向的内存。
最后,必须回答的问题是:为什么foo::arr
本身不是vector<int>
?
- 当然会清理的。
- 不,如果
foo
的destructor
不这样做(或者如果你在擦除之前没有手动做)。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- C++将字符串传递给 C 库以进行内存管理
- 从函数返回时C++内存管理
- 函数指针和 lambda 的内存管理
- 自定义内存管理器在发布模式下工作正常,但在调试模式下则不然
- C++中的内存管理
- C和C++中的内存管理有什么区别
- 字符 * 未从重载运算符或内存管理问题正确返回
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 底层指针和内存管理
- 智能指针,避免使用QNetworkAccessManager时进行手动内存管理
- c++中的内存管理问题
- 使用矢量时的内存管理
- 循环和内存管理中的指针算术C++?
- C++堆栈内存管理问题
- C 内存管理中的课程如何管理 - 研究
- 不可变数据模型的内存管理
- C++ 使用数组初始化时的 STL 向量内存管理
- SFML 纹理内存管理