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的内存是否会自动释放

编辑:自由-->删除

  • 是的,vector类可能会自动分配一个大于所需的空间,以防您以后想在其中存储更多数据,因此它可能不会在每次您
    push_back()
    时分配新空间
  • 是的,但是您应该使用
    删除中间列表而不是
    free()
  • 是的,vector类可能会自动分配一个大于所需的空间,以防您以后想在其中存储更多数据,因此它可能不会在每次您
    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);