为什么要用c ++ vector调用新的调用?

rat*_*016 0 c++ vector new-operator

代码vector<someType> myVector;动态分配内存,因此存储的任何元素都将存在,直到调用delete.那么下面的内容如何vector<someType> *myVector = new vector<someType>();与前一个不同(除了指针之外)?

这里有双重分配吗?每个人都提到混合vector一个new电话是邪恶的,但为什么呢?如果它是邪恶的,为什么它可以接受编译器的代码,什么时候可以使用?

ope*_*och 5

你的第一个陈述不正确.中的元素vector<someType> myVector将一直存在,直到矢量被销毁.如果vector<someType>是局部变量,它将在超出范围时自动销毁.您无需显式调用delete.delete如果考虑到由于可能引发的异常,您的delete语句可能永远不会到达,导致内存泄漏,那么显式调用是容易出错的.例如,比较以下两种情况

void foo()
{
   std::vector<int> v;
   v.push_back(1);
   f(); // f is some operation that might throw exception.
}  // v is automatically destroyed even if f throws.

void bar()
{
   std::vector<int>* v = new std::vector<int>;
   v->push_back(1);
   f(); // f is some operation that might throw exception.
   delete v;  // You need to call delete explicitly here.
              // The vector will be destroyed only if f doesn't throw.
}
Run Code Online (Sandbox Code Playgroud)

除了上述内容之外,向量动态分配内存以存储新元素也是如此.这两种情况的区别在于:

  • std::vector<int> v v是堆栈上的一个对象,它动态分配内存以存储元素.

  • std::vector<int>* v = new std::vector<int> v是指向动态分配对象的指针,它动态分配内存以存储元素.如前所述,您需要明确地调用delete来销毁此对象.