parallel101 / cppguidebook

小彭老师领衔编写,现代C++的中文百科全书
https://142857.red/book/
Other
715 stars 56 forks source link

C++ 应知应会小技巧中有个代码写错啦 #40

Closed muyuuuu closed 3 weeks ago

muyuuuu commented 2 months ago

智能指针防止大对象移动中:

using BigType = array<int, 1000>;  // 4000 字节大小的平坦类型

using BigTypePtr = unique_ptr<BigType>;

vector<BigType> arr;

void func(BigTypePtr x) {
    arr.push_back(std::move(x));  // 只拷贝 8 字节的指针,其指向的 4000 字节不用深拷贝了,直接移动所有权给 vector 里的 BigTypePtr 智能指针
    // 由于移走了所有权,x 此时已经为 nullptr
}

int main() {
    BigTypePtr x = make_unique<BigType>();  // 注意:用智能指针的话,需要用 make_unique 才能创建对象了
    func(std::move(x));  // 只拷贝 8 字节的指针
    // 由于移走了所有权,x 此时已经为 nullptr
}

应该: vector<BigTypePtr> arr;

archibate commented 2 months ago

感谢指出,已修复!