Disadvantages of the Rule of Three

1. You’ll need to add some extra lines of code for the copy constructor, copy assignment operator, and destructor when implementing the Rule of Three.

2. Due to dealing with multiple resources or intricate ownership scenarios can make a class more complex.

3. By following the Rule of Three too strictly might restrict the creativity of certain classes, particularly when you require more advanced features like move semantics.

4. In some cases, a class may not have to handle resources or execute custom copy operations, which renders this Rule.

5. The Rule of Three can be a problem in situations where classes need to work with C libraries or interfaces that don’t have copy-related functions.

6. The Rule of Three can be quite a challenge for beginners, as it requires a deep understanding and precise implementation. It can result in an error if not done correctly.

Rule Of Three in C++

This rule basically states that if a class defines one (or more) of the following, it should explicitly define all three, which are:

Now let us try to understand why? 
The default constructors and assignment operators do shallow copy and we create our own constructor and assignment operators when we need to perform a deep copy (For example when a class contains pointers pointing to dynamically allocated resources).

First, what does a destructor do? It contains code that runs whenever an object is destroyed. Only affecting the contents of the object would be useless. An object in the process of being destroyed cannot have any changes made to it. Therefore, the destructor affects the program’s state as a whole. 

Now, suppose our class does not have a copy constructor. Copying an object will copy all of its data members to the target object. In this case when the object is destroyed the destructor runs twice. Also the destructor has the same information for each object being destroyed. In the absence of an appropriately defined copy constructor, the destructor is executed twice when it should only execute once. This duplicate execution is a source for trouble.

A coding example follows: 

C++





In the example above, once the program goes out of scope, the class destructor is called, not once but twice. First due to deletion of a1 and then of a2. The default copy constructor makes a copy of the pointer vals and does not allocate memory for it. Thus, on deletion of a1, the destructor frees vals. All subsequent vals containing instances when trying to be deleted by the destructor causes the program to crash, as vals do not exist anymore.

This is similar in the case of copy assignment operator. If a class does not have an explicitly defined assignment operator, implicit assignment of all source’s data members to the target’s corresponding data members will occur. All in all, it creates a copy, which again is the same problem defined previously.

References:

  • https://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)
  • http://www.drdobbs.com/c-made-easier-the-rule-of-three/184401400


Similar Reads

Advantages of the Rule of Three

...

Disadvantages of the Rule of Three

1. Ensuring correct resource management particularly dynamic memory allocated during an object’s lifespan...

Conclusion

1. You’ll need to add some extra lines of code for the copy constructor, copy assignment operator, and destructor when implementing the Rule of Three....

Contact Us