CS253: Software Development with C++

Fall 2019

New

Redefining new & delete

Description

In this lab, we’ll show how you can redefine the new/delete operators to achieve a variety of useful or bizarre results.                 

The files for this lab are available in ~cs253/Lab/New.                 

1. Redefining global new/delete

Consider glob.cc. It redefines the global new and delete operators (yes, operators) to add trace output. This could be useful in figuring out just when new and delete are being invoked.                 

Note the function signatures—at this level, new takes a size_t and returns a void *, whereas delete takes a void * and a size_t and returns void. Why does new return void *?                 

2. Redefining class-specific new/delete

Consider class.cc. It redefines the class-specific new and delete operators to add trace output. This will not affect new and delete operations on other types, such as int or double.

3. Forbid new/delete for a specific class

Try to compile forbid1.cc. Does it compile? Why not?                 

4. Same thing, but using =delete

Try to compile forbid2.cc. Does it compile? Why not?                 

5. Same thing, but with a Mixin

forbid-mixin.cc does the same thing as forbid1.cc & forbid2.cc, but encapsulates it in a “mixin”.                 

Why does the mixin class declare its ctor & dtor protected?                 

For another popular example of a mixin, see the Boost class noncopyable                 

6. Error checking

Compile and execute errchk.cc. Observe the error message, and decide what caused it. How would you improve it to detect multiple deletions of the same memory? (You don’t need to write the code, just explain it.)                 

7. Scrubbing the memory

There are several reasons for scrubbing memory.

Consider the technique used in scrub.cc. What criteria would you use to decide on a value for memory? It should be:

For example, a repeated string of “Jack” or “WTF!” would fit all of the above requirements. Notably, an odd value makes for a poor pointer, and may cause a segmentation violation upon use, since some architectures require a four-byte int to be at an address that’s a multiple of four.                 

8. Memory pooling

Run normal.cc.

Now, run pool.cc.

9. Templated version

Of course, it’s a pain to have to redefine new and delete for every class. After we study templates, you will be able to create a templated mixin to do the same for all classes.                 

10. Problems with this approach

11. Exercises

12. For extra fame & glory