Big Three(拷贝构造,拷贝复制,析构)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| class String { public: String (const char* cstr = 0); String (const String& str); String& operator=(const String& str); ~String(); char* get_c_str() const { return m_data; }
private: char* m_data; }
int main() { String s1(); String s2("hello");
String s3(s1); cout << s3 << endl; s3 = s2;
cout << s3 << endl; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| inline String::String(const char* cstr = 0) { if (cstr) { m_data = new char[strlen(cstr) + 1]; strcpy(m_data, cstr); } else { m_data = new char[1]; *m_data = '\0'; } }
inline String::~String() { delete[] m_data; }
|
1 2 3 4 5
| 1. String p1("hello");
2. String p2 = String("hello");
3. String *p3 = new String("hello");
|
方法1、2中都是在栈中分配内存,在栈中内存由系统自动的去分配和释放,释放的顺序也和栈一样,后定义的先释放。
而使用new创建的指针对象是在堆中分配内存,当不需要该对象时,需要我们手动的去释放,否则会造成内存泄漏。
深拷贝,浅拷贝
如果类中有指针成员,则必须写拷贝构造和拷贝赋值函数。
假设 指针a -> “hello”, 指针b -> “world”,当执行 b = a 时,则变成 b 指向 a,造成 “world” 无人指向,发生了内存泄漏,而”hello” 被 a 和 b 同时指向的情况,那么将来一旦改变 a ,b 也会发生改变。那么,这种拷贝称之为 “浅拷贝”。
深拷贝即为我们自己写的拷贝函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| inline String::String(const String& str) { m_data = new char[ strlen(str.m_data) + 1 ]; strcpy(m_data, str.m_data); }
inline String& String::operator=(const String& str) { if(this == &str) return *this;
delete[] m_data; m_data = new char[ strlen(str.m_data) + 1 ]; strcpy(m_data, str.m_data); return *this; }
|