代码 vector<someType> myVector;
动态分配内存,因此存储的任何元素将一直存在,直到调用 delete
。那么下面的 vector<someType> *myVector = new vector<someType>();
与前面的有什么不同(除了作为指针之外)?
这里是否发生了双重分配?每个人都提到将 vector
与 new
调用混合是邪恶的,但为什么呢?如果它是邪恶的,为什么它是编译器可以接受的代码,什么时候可以使用?
原文由 rated2016 发布,翻译遵循 CC BY-SA 4.0 许可协议
你的第一个说法是不正确的。
vector<someType> myVector
中的元素将一直存在,直到向量被破坏。如果vector<someType>
是一个局部变量,它会在超出范围时自动销毁。您不需要显式调用 delete 。如果考虑到可能会抛出异常,那么显式调用delete
很容易出错,您的delete
语句可能永远无法到达,从而导致内存泄漏。例如比较以下两种情况除此之外,向量确实动态分配内存来存储新元素。两种情况的区别在于:
std::vector<int> v
v 是堆栈上的一个对象,它动态分配内存以存储元素。std::vector<int>* v = new std::vector<int>
v 是一个指向动态分配对象的指针,它动态分配内存以存储元素。如前所述,您需要明确调用 delete 来销毁此对象。