1. C++核心概念深度解析
1.1 类对象与类指针的拷贝机制
在C++中,类对象 = *类指针这种写法实际上触发了拷贝赋值运算符。这里需要特别注意的是,默认的拷贝赋值运算符执行的是浅拷贝操作。这意味着:
- 如果类中包含指针成员变量,这种操作只会复制指针值本身,而不会复制指针指向的内存内容
- 两个对象中的指针成员将指向同一块内存区域
- 当其中一个对象被销毁时,可能会造成另一个对象的指针成为悬垂指针
cpp复制class MyClass {
public:
int* data;
MyClass(int size) { data = new int[size]; }
~MyClass() { delete[] data; }
};
int main() {
MyClass* ptr = new MyClass(10);
MyClass obj = *ptr; // 浅拷贝发生
delete ptr; // obj.data现在指向已释放的内存
return 0;
}
重要提示:对于包含指针成员的类,应该实现深拷贝的拷贝构造函数和拷贝赋值运算符,或者使用智能指针来管理资源。
1.2 智能指针的全面应用
现代C++中智能指针是资源管理的利器,但不同类型的智能指针适用于不同场景:
unique_ptr的最佳实践
- 适用于独占所有权的场景,如工厂模式返回的对象
- 可以通过std::move转移所有权
- 性能开销几乎为零,与裸指针相当
- 禁止拷贝操作,避免意外的所有权共享
cpp复制std::unique_ptr<Resource> createResource() {
return std::make_unique<Resource>();
}
void process() {
auto res1 = createResource();
// auto res2 = res1; // 编译错误
auto res2 = std::move(res1); // 所有权转移
}
shared_ptr的陷阱与规避
- 循环引用是shared_ptr最常见的问题
- 使用weak_ptr打破循环引用
- 避免从裸指针创建多个shared_ptr
- 优先使用make_shared而非直接new
cpp复制class Node {
public:
std::shared_ptr<Node> next;
std::weak_ptr<Node> prev; // 使用weak_ptr避免循环引用
};
void sharedPtrDemo() {
auto node1 = std::make_shared<Node>();
auto node2 = std::make_shared<Node>();
node1->next = node2;
node2->prev = node1; // 不会增加引用计数
}
weak_ptr的正确使用姿势
- 主要用于观察shared_ptr管理的对象
- 必须通过lock()方法获取可用的shar
