C++ 深入理解:string 类的模拟实现与核心机制
在之前的学习中,我们可能已经接触过 string 类的基本用法。但在面试或底层开发中,面试官更希望看到你如何从零构建它。最核心的考察点通常集中在构造、拷贝构造、赋值运算符重载以及析构函数这'四大金刚'上。
面试中的经典考点:String 基础
先看下面这段看似正常的实现,是否存在隐患?
// 为了和标准库区分,此处使用 MyString
class MyString {
public:
MyString(const char* str = "") {
if (str == nullptr) {
assert(false);
return;
}
_str = new char[strlen(str) + 1];
strcpy(_str, str);
}
~MyString() {
if (_str) {
delete[] _str;
_str = nullptr;
}
}
private:
char* _str;
};
测试一下:
void TestString() {
MyString s1("hello");
MyString s2(s1);
}
这里没有显式定义拷贝构造函数,编译器会生成默认的。当用 s1 构造 s2 时,发生的是浅拷贝。最终导致 s1 和 s2 共用同一块内存空间。当程序结束析构时,同一块空间被释放两次,引发程序崩溃。
浅拷贝与深拷贝
浅拷贝(位拷贝)只是简单地将对象中的值拷贝过来。如果对象内部管理了动态资源(如堆内存),多个对象共享同一份资源,其中一个销毁后,另一个再访问就会违规。
这就好比家里有两个孩子,但父母只买了一份玩具。如果两人愿意一块玩,则万事大吉;万一不想分享就你争我夺,玩具损坏。


