【发布时间】:2021-12-21 02:14:01
【问题描述】:
编译库的痛苦在于永远不知道内存是如何管理的。 我被引导相信向量的元素被放置在堆上,除非明确告知不要这样做。
被放在堆上,不用的时候显然需要删除,好像删除vector对象的时候会出现这种情况。
问题是当at(#)或operator[]被调用时,它会删除被替换的内存吗?
例如:
std::vector<string> secretlyAnArray(5);
secretlyAnArray.at(0) = std::string("Does this memory leak?");
secretlyAnArray.at(0) = std::string("When I overwrite the object?")
很高兴学习更好的方法来替换向量的特定索引处的数据,或者只是指向解释它的文档。
编辑 2: 在非常感谢 Anis 和 Daniel 的帮助之后;似乎 at(#) 返回一个引用,然后应用标准引用规则而不是受向量的行为支配。
【问题讨论】:
-
at 返回给定位置的对象的引用,因此您的对象将被分配或移动
-
@AnisBelaid 啊,所以它只是更新数据而不是替换对象?因此,如果您使用的是自定义类,那么如果您有一个复制构造函数,而不是分配和移动运算符,它会严重中断吗? (如果浅拷贝还不够)
-
是的,它不起作用,也没有内存泄漏,因为临时对象在范围之外被破坏
-
“我被引导相信向量被放置在堆上,除非明确告知不要这样做。” — 向量对象放置在您创建它的任何位置。在自动存储持续时间的情况下(基本上是函数本地非静态变量),它将在典型实现的堆栈上。但是向量元素总是在堆上(至少使用默认分配器)。
-
一般来说,如果您使用过
new,则需要使用delete(或将您的对象传递给可以为您执行此操作的对象),否则已分配内存的类应该释放它自动销毁