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)
    return;
  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.

From 3.7.3.1/2

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

Also

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
3.7.3.1/2

[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