ما هي "قاعدة الثلاثة" في C++ ولماذا بدونها يحدث تسرب للذاكرة؟
مرحباً بالجميع! بدأت تعلم C++ وواجهت مشكلة. أكتب class بسيطاً يخزن string عبر الذاكرة الديناميكية. يبدو الأمر منطقياً، لكن البرنامج يتعطل أو يتصرف بشكل غريب.
إليك الكود الخاص بي:
```cpp
class String {
public:
String(const char* str = "") {
size = strlen(str);
data = new char[size + 1];
strcpy(data, str);
}
~String() {
delete[] data;
}
private:
char* data;
int size;
};
int main() {
String s1("Hello");
String s2 = s1; // نسخ
String s3("World");
s3 = s1; // تعيين
return 0;
}
```
بعد التشغيل، يتعطل البرنامج مع خطأ double free. أفهم أن المشكلة هي أنه عند النسخ، يشير كلا الكائنين إلى نفس الذاكرة، ثم يحاول كلاهما حذفها. لكن كيف يمكن إصلاح هذا بشكل صحيح؟ ما هي "قاعدة الثلاثة" التي يذكرها الجميع؟ ولماذا يقولون إنه في C++11 ظهرت "قاعدة الخمسة"؟ سأكون ممتناً لشرح مفصل.