gpt4 book ai didi

c++ - 移动构造函数被再次调用c++

转载 作者:行者123 更新时间:2023-12-04 07:39:33 26 4
gpt4 key购买 nike

我刚刚为移动构造函数编写了一个代码,它被再次调用为传递给 pushback 方法的值 2

#include <iostream>
#include <vector>
using namespace std;
class n{
int *ptr;
public:
n(int d):ptr{new int(d)}{cout<<"constuctor called for "<<d<<endl;
}
n(n &&s)noexcept:ptr{s.ptr}{
s.ptr=nullptr;
cout<<"move constructor called for "<<*ptr<<endl;}//this is being called again for 2

~n(){
if(ptr==nullptr)
cout<<"freeing storage for nullptr "<<ptr<<endl;
else
cout<<"freeing storage for ptr "<<*ptr<<endl;
delete ptr;
}
};
int main() {
vector<n>b;
b.push_back(n{2});
b.push_back(n{3});;
return 0;
}

最佳答案

一个 std::vector为其数据保存一个缓冲区,该缓冲区在后台自动管理。每次向 vector 添加项目时,都会检查此缓冲区的大小 - 如果已用尽,将分配新内存。然后所有现有元素将被复制或移动(取决于所讨论类型的属性)到新缓冲区中。为了可视化这一点,首先获取这个空缓冲区。

||
现在,您调用 push_back vector 上。这为一个元素请求空间。 vector 的容量为空(尚未分配缓冲区),因此它将分配并将对象放入缓冲区:
|-  n{2}  -|
在这里,容量是一 - 没有额外元素的空间。当您调用 push_back还有一次, std::vector需要更多的缓冲空间。它执行以下操作:
  • 分配动态内存
  • 如果它们有 noexcept,则将所有现有元素移动构造到新缓冲区中移动构造函数 - 否则,它们将被复制。
  • 追加新元素。
  • old buffer:      |-  n{2}  -|
    new buffer: |- -|- -|
    move existing: |- n{2} -|- -|
    add new element: |- n{2} -|- n{3} -|
    将现有元素移动到新缓冲区时,会发生第二次移动构造。

    关于c++ - 移动构造函数被再次调用c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67566471/

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