Consider this C++ function:

void LeakyFunction() {
  int* i = new int;
  int* j = i;
  i = new int;
  delete i;
}

You see the problem? We allocated the memory for the initial i, but then we put it into j and forgot about it. The memory that's pointed to by j is never deallocated, and our only reference to it (the pointer j) is lost at the end of the function. If you call LeakyFunction() again and again and again, you'll eventually run out of memory and your program will crash.

The above is a trivial example, but it demonstrates how memory can be lost and nothing useful gained. Now scale this up to a full project with thousands of classes, and a few hundred leaks with bigger objects...