The fact is that new , like pregnancy, creates a resource that is managed manually (i.e. by you), and as such it is responsible.
C ++ is a language for writing libraries, and anytime you see responsibility, the “C ++” approach is to write a library element that handles this, and that’s just that, responsibility. For dynamic memory allocation, these library components already exist and are generally referred to as smart pointers; you need to look at std::unique_ptr and std::shared_ptr (or their TR1 or Boost equivalents).
When writing blocks with one responsibility, you really need to say new and delete . But you do it once, and you think carefully about it and make sure that you provide the correct semantics for copying, assigning, and destroying. (From the point of view of exception safety, one responsibility is crucial since handling more than one single resource at a time is terribly immodest.)
After you put everything into suitable building blocks, you compose these blocks into larger and larger code systems, but in this case you no longer need to carry out any responsibility for the leadership, since the building blocks already do this for you.
Since the standard library offers resource management classes for the vast majority of use cases (dynamic arrays, smart pointers, file descriptors, strings), the fact is that a well-designed and created C ++ project should have very little need for any kind of manual resource management which includes the use of new . All objects of your handler are either automatic (regions) or members of other classes, instances of which are in turn covered or managed by someone.
Given this, the only time you should say new is when you create a new resource management object; although even then this is not always necessary:
std::unique_ptr<Foo> p1(new Foo(1, 'a', -2.5));
Update: I think I could solve only half the problems with the OP. Many people coming from other languages have the impression that any object should be created with the expression new -type. This in itself is very useless thinking when approaching C ++:
The most important difference in C ++ is the lifetime object, or "storage class." It can be one of the following: automatic (copied), static (permanent) or dynamic (manual). Global variables have a static lifetime. The vast majority of all variables (declared as Foo x; inside the local scope) have an automatic lifetime. For dynamic storage only, we use the expression new . The most important thing to understand when you come to C ++ from another OO language is that most objects only need battery life, and therefore there is never anything to worry about.
So, the first implementation should be that "C ++ rarely requires dynamic storage." I feel that this may have been part of the OP question. The question may have been better worded as "Is it really a bad idea to dynamically allocate objects?" Only after you decide that you really need a dynamic repository, which we get before actually discussing whether to say a lot of new and delete , or if there are preferred alternatives, which is the point of my original answer.