C++-এ Rule of Three (বিগ থ্রি বা ল অফ বিগ থ্রি) হলো একটি নিয়ম: যদি কোনো ক্লাস নিচের তিনটি থেকে যেকোনো একটি এক্সপ্লিসিটলি ডিফাইন করে, তবে অবশ্যই তিনটিই এক্সপ্লিসিটলি ডিফাইন করা উচিত।
- ডিস্ট্রাক্টর (Destructor)
- কপি কনস্ট্রাক্টর (Copy Constructor)
- কপি অ্যাসাইনমেন্ট অপারেটর (Copy Assignment Operator)
এগুলো 스페সিয়াল মেম্বার ফাংশন। প্রোগ্রামার ডিফাইন না করলে কম্পাইলার ইমপ্লিসিট ভার্সন দেয়। কিন্তু যদি ক্লাসে ডাইনামিক্যালি এলোকেটেড রিসোর্স (পয়েন্টার) থাকে, তবে শ্যালো কপি (shallow copy) এর কারণে ডাবল ফ্রি (double free) বা করাপশন হয়। এটাই রুল অফ থ্রির কারণ।
সমস্যা উদাহরণ
class Numbers {
int num;
int* ptr;
public:
Numbers(int n, int* p) { // কনস্ট্রাক্টর
num = n;
ptr = new int[num];
}
~Numbers() { // ডিস্ট্রাক্টর
delete ptr;
ptr = NULL;
}
// কপি কনস্ট্রাক্টর ও কপি অ্যাসাইনমেন্ট নেই!
};
int main() {
int arr[4] = {11,22,33,44};
Numbers Num1(4, arr);
Numbers Num2(Num1); // ডিফল্ট কপি কনস্ট্রাক্টর কল হয়
return 0; // স্কোপ শেষে ডিস্ট্রাক্টর দুবার কল → double free error
}
আউটপুট: *** Error: double free or corruption *** Aborted
সমাধান
কপি কনস্ট্রাক্টর ও কপি অ্যাসাইনমেন্ট অপারেটর এক্সপ্লিসিটলি লিখুন যাতে ডিপ কপি (deep copy) হয়।