Effective C++ by Scott Meyers (Short Summary)
  • Introduction
  • Chapter 1 - Accustoming Yourself to C++
    • Item 1 - View C++ as a federation of languages.
    • Item 2 - Prefer consts, enums, and inlines to #defines.
    • Item 3 - Use const whenever possible.
    • Item 4 - Make sure that objects are initialized before they’re used.
  • Chapter 2 - Constructors, Destructors, and Assignment Operators
    • Item 5 - Know what functions C++ silently writes a calls.
    • Item 6 - Explicitly disallow the use of compiler-generated functions you do not want.
    • Item 7 - Declare destructors virtual in polymorphic base classes.
    • Item 8 - Prevent exceptions from leaving destructors.
    • Item 9 - Never call virtual functions during construction or destruction.
    • Item 10 - Have assignment operators return a reference to *this.
    • Item 11 - Handle assignment to self in operator=.
    • Item 12 - Copy all parts of an object.
  • Chapter 3 - Resource Management
    • Item 13 - Use objects to manage resources.
    • Item 14 - Think carefully about copying behavior in resource-managing classes.
    • Item 15 - Provide access to raw resources in resource-managing classes.
    • Item 16 - Use the same form in corresponding uses of new and delete.
    • Item 17 - Store newed objects in smart pointers in standalone statements.
  • Chapter 4 - Designs and Declarations
    • Item 18 - Make interfaces easy to use correctly and hard to use incorrectly.
    • Item 19 - Treat class design as type design.
    • Item 20 - Prefer pass-by-reference-to-const to pass-by-value.
    • Item 21 - Don't try to return a reference when you must return an object.
    • Item 22 - Declare data members private.
    • Item 23 - Prefer non-member non-friend functions to member functions.
    • Item 24 - Declare non-member functions when type conversions should apply to all parameters.
    • Item 25 - Consider support for a non-throwing swap.
Powered by GitBook
On this page
  1. Chapter 3 - Resource Management

Item 16 - Use the same form in corresponding uses of new and delete.

What's wrong with this picture?

std::string *stringArray = new std::string[100];
...
delete stringArray;

Here, the new is matched with a delete, Still, something is quite wrong. 99 of the 100 string objects pointer to by stringArray are unlikely to be properly destroyed, because their destructors will probably never be called.

Background process of new: When you employ a new expression (i.e., dynamic creation of an object via a use of new), two things happen.

  • memory is allocated (via function named operator new)

  • One or more constructors are called for that memory.

Background process of delete: When you employ a delete expression (i.e., use delete), two things happen

  • one or more destructors are called for the memory.

  • memory is deallocated (via function named operator delete)

Example:

std::string *stringPtr1 = new std::string;
std::string *stringPtr2 = new std::string[100];
...
delete stringPtr1;        // delete an object
delete[] stringPtr2;      // delete an array of objects

The rule is simple: if you use [] in a new expression, you must use [] in the corresponding delete expression. If you don't use [] in a new expression, don't use [] in the matching delete expression.

This rule is also noteworthy for the typedef-inclined, because it means that a typedef's author must document which form of delete should be employed when new is used to conjure up objects of the typedef type. For example, consider this typedef:

// a person's address has 4 lines, each of which is a string
typedef std::string AddressLines[4];

Because AddressLines is an array, this use of new,

// note that "new AddressLines" returns a string*, just like "new string[4]" would
std::string* pal = new AddressLines;

must be matched with the array form of delete

delete pal;                // undefined!
delete[] pal;              // fine

Things to Remember

  • if you use[] in a new expression, you must use [] in the corresponding delete expression. If you don't use [] in a new expression, you must not use [] in the corresponding delete expression.

PreviousItem 15 - Provide access to raw resources in resource-managing classes.NextItem 17 - Store newed objects in smart pointers in standalone statements.

Last updated 3 years ago