C++ c++;关于指针的内存问题+;非指针
假设我声明了一个变量C++ c++;关于指针的内存问题+;非指针,c++,pointers,memory,C++,Pointers,Memory,假设我声明了一个变量 vector<int>* interList = new vector<int>(); interList->push_back(1); interList->push_back(2); interList->push_back(3); interList->push_back(4); vector*interList=newvector(); 中间列表->推回(1); 中间列表->推回(2); 中间列表->推回(3); 中
vector<int>* interList = new vector<int>();
interList->push_back(1);
interList->push_back(2);
interList->push_back(3);
interList->push_back(4);
vector*interList=newvector();
中间列表->推回(1);
中间列表->推回(2);
中间列表->推回(3);
中间列表->推回(4);
第一个问题是,当我向后推一个int时,会消耗一个内存空间吗
第二个问题如果我(删除中间列表),消耗1,2,3,4的内存是否会自动释放
编辑:自由-->删除
push_back()
时分配新空间删除中间列表代码>而不是free()
push_back()
时分配新空间删除中间列表代码>而不是free()
push_back
将元素复制到堆中,向量将在堆中分配数组来存储元素。vector
的容量可以大于所需容量,也可以大于该vector的元素数。每次发生推回时,向量检查是否有足够的空间,如果没有,则将所有元素移动到更大的空间,然后将元素推送到数组中。向量总是将元素放在连续的内存块中,因此,如果内存块不够大,无法将所有元素放在一起,那么它会将所有元素移动到更大的块中,并附加新元素。为了避免这种频繁的移动,向量通常会分配更大的内存块
delete interList
会破坏向量和向量所包含的整数。在这里,向量将在堆上,整数也将在堆上。实际上,最好在堆栈上创建向量,或者作为其他对象的成员,例如向量interList代码>堆栈上的向量将堆上的int元素存储为数组。由于int被存储为值类型,所以一旦向量超出范围,int的内存就会被回收
因为向量有值类型。它们被向量复制到堆中,并作为数组存储和管理,它们的生存期与向量的生存期相关联。如果你有一个指针向量,那么你必须担心。如向量列表代码>列表。向后推(新的T())代码>该列表存储指向类型为T
的对象的指针。销毁此类向量时,T
对象不会被删除。这与指针指向T*
的类相同。您必须循环遍历所有元素,并在指针上调用delete或使用共享指针的vector。建议使用共享指针或唯一指针的向量。push_back
将元素复制到堆中,向量将在堆中分配数组来存储元素。vector
的容量可以大于所需容量,也可以大于该vector的元素数。每次发生推回时,向量检查是否有足够的空间,如果没有,则将所有元素移动到更大的空间,然后将元素推送到数组中。向量总是将元素放在连续的内存块中,因此,如果内存块不够大,无法将所有元素放在一起,那么它会将所有元素移动到更大的块中,并附加新元素。为了避免这种频繁的移动,向量通常会分配更大的内存块
delete interList
会破坏向量和向量所包含的整数。在这里,向量将在堆上,整数也将在堆上。实际上,最好在堆栈上创建向量,或者作为其他对象的成员,例如向量interList代码>堆栈上的向量将堆上的int元素存储为数组。由于int被存储为值类型,所以一旦向量超出范围,int的内存就会被回收
因为向量有值类型。它们被向量复制到堆中,并作为数组存储和管理,它们的生存期与向量的生存期相关联。如果你有一个指针向量,那么你必须担心。如向量列表代码>列表。向后推(新的T())代码>该列表存储指向类型为T
的对象的指针。销毁此类向量时,T
对象不会被删除。这与指针指向T*
的类相同。您必须循环遍历所有元素,并在指针上调用delete或使用共享指针的vector。建议使用共享指针或唯一指针的向量。std::Vector一次为一些元素分配continuos内存块。所以每次插入新元素时,它都会被插入到保留块中,并且内存空间保持不变,不会发生新的分配
如果在分配的块(向量的容量)之外插入元素,则它将分配一个更大的块(调整大小),将以前的所有元素复制到该块中并销毁旧块。所以向量本身管理内存,而不是每个插入的元素导致内部缓冲区的重新分配
第二个问题-是的,如果删除向量本身,向量将清除所有内存
delete interList;
vector一次为一些元素分配continuos内存块。所以每次插入新元素时,它都会被插入到保留块中,并且内存空间保持不变,不会发生新的分配
如果在分配的块(向量的容量)之外插入元素,则它将分配一个更大的块(调整大小),将以前的所有元素复制到该块中并销毁旧块。所以向量本身管理内存,而不是每个插入的元素导致i的重新分配
vector<int> interList;
interList.push_back(1);
interList.push_back(2);
interList.push_back(3);
interList.push_back(4);
auto interList = std::make_shared<vector<int>>();
interList->push_back(1);
interList->push_back(2);
interList->push_back(3);
interList->push_back(4);