Empty destructors may cause unnecessary data copies
User-declared empty destructors prevent autogeneration of move constructors and move assignment operators
Since R2020a
Description
This defect occurs when a class definition contains a user-defined destructor that has an
empty or =default
implementation and does not declare both a move
constructor and move assignment operator. For
instance:
class aClass { public: ~aClass() noexcept {} // Empty body }; class bClass { public: ~bClass() = default; };
An empty destructor is not flagged if:
The destructor is private or protected.
The destructor is declared final.
The destructor is declared virtual and does not override a base class destructor.
The destructor overrides a base class pure virtual destructor.
The class has a trivial copy constructor (and therefore a copy operation is not more expensive than a move operation).
Risk
Instances of this class might be unnecessarily copied in situations where a move operation would have been possible. Copy operations are more expensive than move operations and might impact performance.
Fix
Try one of these solutions:
Remove the empty destructor if possible. If a class does not have a destructor, the compiler generates a destructor, which is essentially the empty destructor that you explicitly declared.
See also Rule of Zero.
If you cannot remove the destructor, add an explicit move constructor and move assignment operator to the class definition. Use the
=default
syntax to clarify that the compiler definitions of move constructors and move assignment operators are used.class aClass { public: ~aClass() noexcept = default; aClass(aClass&& ) = default; aClass& operator=(aClass&& ) = default; };
See also Rule of Five.
Performance improvements might vary based on the compiler, library implementation, and environment that you are using.
Result Information
Group: Performance |
Language: C++ |
Default: Off |
Command-Line Syntax:
EMPTY_DESTRUCTOR_DEFINED |
Impact: Low |
Version History
Introduced in R2020a
See Also
Topics
- Interpret Bug Finder Results in Polyspace Desktop User Interface
- Interpret Bug Finder Results in Polyspace Access Web Interface (Polyspace Access)
- Address Results in Polyspace User Interface Through Bug Fixes or Justifications
- Address Results in Polyspace Access Through Bug Fixes or Justifications (Polyspace Access)