【发布时间】:2021-08-06 12:36:50
【问题描述】:
我刚刚为 move 构造函数编写了一个代码,它被再次调用以传递给 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;
}
【问题讨论】:
-
检查
capacityofvector... -
std::vector在需要时重新分配内存,然后将元素复制或移动到新内存。 -
题外话:你注意到
delete ptr也会因为缺少大括号而被调用为空指针吗?实际上,这不是错误,因为删除空指针是合法的,但没有必要。 -
添加到@Aconcagua 的评论中,
ptr实际上永远不会是空指针,因为普通的new如果失败会抛出异常。 -
继@Someprogrammerdude 的评论之后:尝试
reserve-为您的对象提供足够的空间。
标签: c++ object vector move-constructor pushbackinputstream