Vector::erase()也擦除结构体的成员向量
vector::erase() also erases member-vectors of a struct
各位,我是第一次接触这些编程话题。到目前为止,通过谷歌很容易找到答案,但在这里,我很难表达我想问的问题,让我试试:在释放内存之前,删除一个向量调用析构函数,对吧?现在,如果结构向量被析构,它会如何反应?人们没有为这些东西定义析构函数,但是假设如果一个结构被"析构",它的每个成员的析构函数也将被调用,这是正确的吗?
让我给你一个例子:
#include <string>
#include <vector>
struct ding_t {
std::string dang;
} foo;
strung boom_t {
vector <ding_t> chuck;
} bar;
int main () {
vector <boom_t> tom;
tom.resize(10);
tom[4].chuck.resize(5);
tom[4].chuck[3].dang = "jerry";
tom.erase();
return 0;
}
在这种情况下,所分配的内存
tom[4].chuck.resize(5);
也被释放了吗?对不起,我的词汇量,但在这一刻,我正试图从指针转移到更复杂的cpp语言等效向量。我希望你明白了我的意思。提前感谢各位,如果已经有人问过这个问题,请重新引导我,正如我所说的,我不知道如何限定这个问题
是,内存将自动释放。
当vector对象被析构时,将调用其所包含的所有元素的析构函数。您没有为struct
定义析构函数,因此编译器将为您提供一个默认的析构函数(它不做任何事情)。
但是,如果vector包含指向对象的指针,则在对vector进行析构之前,你的责任是调用对象的析构函数(因为vector将调用指针的析构函数,而不是指向对象的析构函数),如果以后没有其他方法可以访问它们,
请参阅http://www.parashift.com/c++-faq-lite/dtors.html#faq-11.11以获得您问题的答案,并参阅整篇文章以获得c++中析构函数的良好处理。
关于你的第二个问题:是的,tom[4].chuck.resize(5);
分配的内存也将被释放,因为它是向量的责任来管理自己的内存分配(这是"resize()"调用的情况。
答案:由于您没有使用new
操作符动态分配对象,因此您不必手动释放它们。这是自动为您完成的。
Ok。回到你的代码:)
如果你想擦除第6个元素,然后使用tom.erase (tom.begin()+5)
。
如果你想擦除所有的元素,然后使用tom.erase (tom.begin(),tom.end() )
。
删除前3个元素使用tom.erase (tom.begin(),tom.begin()+3)
。
#include <string>
#include <vector>
using namespace std;
struct ding_t
{
std::string dang;
} foo;
struct boom_t {
std::vector <ding_t> chuck;
} bar;
int main () {
vector <boom_t> tom;
tom.resize(10);
tom[4].chuck.resize(5);
tom[4].chuck[3].dang = "jerry";
//error C2661: 'erase' : no overloaded function takes 0 parameters
//tom.erase( );
// erase the 6th element
tom.erase (tom.begin()+5);
// erase the first 3 elements:
//tom.erase (tom.begin(),tom.begin()+3);
// erase everything:
//tom.erase (tom.begin(),tom.end() );
return 0;
}
好的,我做了这个小检查,只是为了确保。为什么我没有早点想到这一点……昨天很晚……最初的代码写得很糟糕,不能工作,为此道歉。
:
#include <string>
#include <vector>
struct ding_t {
std::string dang;
} foo;
struct boom_t {
std::vector <ding_t> chuck;
} bar;
int main () {
std::vector <boom_t> tom;
while (true) {
tom.resize(10);
tom[4].chuck.resize(5);
tom[4].chuck[3].dang = "jerry";
tom.erase( tom.begin(), tom.end() );
}
return 0;
}
不导致内存泄漏,使用的内存是稳定的
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 如何使用结构体的向量数组?
- 如何使用迭代器指向结构体c++的向量
- 创建结构体向量,表达式:向量下标超出范围
- C++ push_back() 一个结构体到一个向量中
- 使用 boost::p ython,如何将结构体向量作为字典列表返回给 Python
- 交换结构体 c++ 向量的内容
- Vector::erase()也擦除结构体的成员向量
- 如何在结构体中传递指向CURL的指针到向量
- 对的向量和包含两个元素的结构体的向量的内存布局的区别- c++ /STL
- 列表排序和结构体向量排序之间的性能差距.c++
- 带有指针的结构体向量
- 结构体向量的问题:解约束迭代器(可能很容易)
- 试图使用指向结构体向量的指针访问结构体类型时出错
- 如何在结构体向量的ROS中发布消息?
- c++中初始化结构体向量的正确方法
- 使用命令行参数创建结构体向量
- c++结构体向量的适当方法
- 结构体向量与结构体向量的映射
- 从文本文件c++中加载结构体向量的奇怪问题