Compiler Warning (level 1) C4291

Visual Studio 6.0

'declaration' : no matching operator delete found; memory will not be freed if initialization throws an exception

A placement new is used for which there is no placement delete.

You could reproduce this error by defining the following class in a global namespace:

typedef unsigned int size_t;

class MemBuffer_t {
   void *Alloc(size_t);

MemBuffer_t memBuffer;

void *operator new(size_t size, MemBuffer_t &rBuffer)
   return rBuffer.Alloc(size);

class X {

void f()
   X *pX = new (memBuffer) X(10);

This warning will only occur if the user compiles the code with /GX, exception handling enabled.

The fix for the warning is to declare and/or define the following operator delete after you define your operator new:

void operator delete(void *pMem, MemBuffer_t &rBuffer);