C++: memory leaks

The question: At what value of variable n the following code will cause memory leaks?

That’s the code:

int* Bar(int n)
  if (n == 1)
    throw "exception";
  return new int[n];

void Foo(int n)
  int *a = Bar(n);
  if (n <= 2)
  delete[] a;

From 5.3.4/7

When the value of the expression in a
direct-new-declarator is zero, the
allocation function is called to
allocate an array with no elements.


The effect of dereferencing a pointer
returned as a request for zero size is


Even if the size of the space
requested [by new] is zero, the
request can fail.

That means you can do it, but you can
not legally (in a well defined manner
across all platforms) dereference the
memory that you get – you can only
pass it to array delete – and you
should delete it.

Here is an interesting foot-note (i.e
not a normative part of the standard,
but included for expository puprposes)
attached to the sentence from

[32. The intent is to have operator
new() implementable by calling
malloc() or calloc(), so the rules are
substantially the same. C++ differs
from C in requiring a zero request to
return a non-null pointer.]

  • And if n is 1 we get:

int *a = Bar(1) and Bar(1) throws exception. Will it be the exception in constructor of variable a? And will it cause memory leaks?

C++: memory leaks