Why should C++ programmers minimize use of 'new'?

Viewed 166786

I stumbled upon Stack Overflow question Memory leak with std::string when using std::list<std::string>, and one of the comments says this:

Stop using new so much. I can't see any reason you used new anywhere you did. You can create objects by value in C++ and it's one of the huge advantages to using the language.
You do not have to allocate everything on the heap.
Stop thinking like a Java programmer.

I'm not really sure what he means by that.

Why should objects be created by value in C++ as often as possible, and what difference does it make internally?
Did I misinterpret the answer?

19 Answers

Many answers have gone into various performance considerations. I want to address the comment which puzzled OP:

Stop thinking like a Java programmer.

Indeed, in Java, as explained in the answer to this question,

You use the new keyword when an object is being explicitly created for the first time.

but in C++, objects of type T are created like so: T{} (or T{ctor_argument1,ctor_arg2} for a constructor with arguments). That's why usually you just have no reason to want to use new.

So, why is it ever used at all? Well, for two reasons:

  1. You need to create many values the number of which is not known at compile time.
  2. Due to limitations of the C++ implementation on common machines - to prevent a stack overflow by allocating too much space creating values the regular way.

Now, beyond what the comment you quoted implied, you should note that even those two cases above are covered well enough without you having to "resort" to using new yourself:

  • You can use container types from the standard libraries which can hold a runtime-variable number of elements (like std::vector).
  • You can use smart pointers, which give you a pointer similar to new, but ensure that memory gets released where the "pointer" goes out of scope.

and for this reason, it is an official item in the C++ community Coding Guidelines to avoid explicit new and delete: Guideline R.11.

One more point to all the above correct answers, it depends on what sort of programming you are doing. Kernel developing in Windows for example -> The stack is severely limited and you might not be able to take page faults like in user mode.

In such environments, new, or C-like API calls are prefered and even required.

Of course, this is merely an exception to the rule.

Related