CS253: Software Development with C++

Spring 2020

New

Redefining new & delete                

Description                

The files for this lab are available in ~cs253/Lab/New. In this lab, we’ll show how you can redefine the new/delete operators to achieve a variety of useful or bizarre results. Record your answers to the questions asked in a file called recit09.txt, and check them in (see below).                 

new and delete are operators. We use them like this:                 

    int *p = new int[100];
    for (int i=0; i<100; i++)
        p[i] = i*i;		// table of squares
    delete[] p;

I don’t see any parentheses, so new isn’t a function, it’s an operator. Of course, when we override an operator, to provide our own implementation, we write a function or method. Therefore, we write a methods named operator new and operator delete.                 

1. Redefining global new/delete                

Consider glob.cc. It redefines the global new and delete 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 *, as opposed to int *, or double *, or whatever type we’re allocating?                 

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”.                 

A “mixin” is a base class, designed for inheritance, but don’t think of it as an “is-a” relationship. Instead, think of the base class as contributing methods to the derived class. It’s similar to how they mix chocolate sprinkles or crushed cookies into ice cream at places like Cold Stone Creamery.                 

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

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 is the best byte value to use for writing to memory? For example, zero is a poor choice, because it makes nice zero integers and zero floating-point values. You want something more disruptive, something that makes a poor int, double, pointer, or string. Explain your reasoning.                 

8. Memory pooling                

Run normal.cc.

Now, run pool.cc.

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.                 

9. Problems with memory pooling                

10. Speed                

11. Space                

12. For extra fame & glory