22.5 — std::unique_ptr
在本章开头,我们讨论了在某些情况下使用指针可能导致错误和内存泄漏。例如,当函数提前返回或抛出异常时,如果指针没有被正确删除,就可能发生这种情况。#include <iostream> void someFunction() { auto* …
在本章开头,我们讨论了在某些情况下使用指针可能导致错误和内存泄漏。例如,当函数提前返回或抛出异常时,如果指针没有被正确删除,就可能发生这种情况。#include <iostream> void someFunction() { auto* …
考虑C++中的一个固定大小的整数数组:int array[5]; 如果我们想用值初始化这个数组,我们可以直接通过初始化列表语法来完成:#include <iostream> int main() { int array[] { 5, 4, 3, 2, 1 }; // 初始化列表 for (auto i : …
一旦你开始更频繁地使用移动语义,你就会发现有些情况下你想调用移动语义,但你必须使用的对象是左值,而不是右值。考虑以下交换函数作为示例:#include <iostream> #include <string> template <typename T> void mySwapCopy(T& a, …
在这一课中,我们探讨了std::auto_ptr,讨论了对移动语义的需求,并探讨了当为复制语义设计的函数(复制构造函数和复制赋值运算符)被重新定义以实现移动语义时出现的一些缺点。在本课中,我们将…
在第12章中,我们介绍了值类别的概念(),它是表达式的一个属性,有助于确定表达式是解析为值、函数还是对象。我们还介绍了左值和右值,以便我们可以讨论左值引用。如果你对左值和右值感到模糊,…
考虑一个动态分配值的函数:void someFunction() { Resource* ptr = new Resource(); // Resource 是一个结构体或类 // 在这里对 ptr 进行操作 delete ptr; } 尽管上述代码看起来相当简单,但很容易忘记释放 ptr。即使…
Try 和 catch 块在大多数情况下工作良好,但在一种特殊情况下它们不够用。考虑以下示例:#include <iostream> class A { private: int m_x; public: A(int x) : m_x{x} { if (x <= 0) throw 1; // 异常在此处抛出…
考虑以下简短程序:#include <iostream> enum class FruitType { apple, banana, cherry }; class Fruit { private: FruitType m_type { }; int m_percentageEaten { 0 }; public: Fruit(FruitType type) : m_type { type } { } FruitType getType() { return m_type; } int getPercentageEaten() { return m_percentageEaten; } …