gpt4 book ai didi

C++: vector 实现和动态内存分配

转载 作者:太空狗 更新时间:2023-10-29 20:43:21 25 4
gpt4 key购买 nike

我想了解 vector 是如何在 C++ 中实现的。有一个 previous question那问这个,所以我看了一下,我有一个小问题。假设链接问题中的实现是正确的,让我们看一下这段代码:

int main(){
Vector<int> test2 = test_Vector();
cout << test2[0] << endl;
return 0;
}


// below is NOT the STL vector object, but the one in the linked question,
// in which the asker tries to implement STL vector himself/herself
Vector<int> test_Vector(){
Vector<int> test;
test.push_back(5);
return test;
}

据我理解,testVector对象是在本地创建的,所以当test_Vector方法返回时,本地对象就出作用域,从而调用析构函数并删除动态数组。由于代码确实有效并且打印了 5,我想我错了。什么是正确的解释?

最佳答案

你是对的,但你错过了一件重要的事情。

因为您返回的是 Vector<int> ,您应该将其视为被复制。这通常会调用复制构造函数,复制 test。进入 Vector<int> 的新实例.复制构造函数在链接问题中实现为:

template<class T>
Vector<T>::Vector(const Vector<T> & v)
{
my_size = v.my_size;
my_capacity = v.my_capacity;
buffer = new T[my_size];
for (int i = 0; i < my_size; i++)
buffer[i] = v.buffer[i];
}

请注意,由于返回值优化,复制构造函数可能不会被调用(请参阅下面的评论中的头发 split )。在许多情况下,允许编译器优化复制,并且 C++ 标准允许这种优化可能会改变程序行为

无论是对象被复制,还是应用了 RVO,你应该得到同样的结果。只要您遵循正常的面向对象实践,优化就不会破坏您的对象。

您应该始终将函数返回值视为按值传递( 复制)而不考虑类型,然后考虑您的编译器可能正在执行 RVO。重要的是不要忘记 Rule of Three (或四个,或五个)。

关于C++: vector 实现和动态内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15536515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com