After reading this famous rant by Linus Torvalds, I wondered what actually are all the pitfalls for programmers in C++. I'm explicitly not referring to typos or bad program flow as treated in this question and its answers, but to more high-level errors which are not detected by the compiler and do not result in obvious bugs at first run, complete design errors, things which are improbable in C but are likely to be done in C++ by newcomers who don't understand the full implications of their code. 

I also welcome answers pointing out a huge performance decrease where it would not usually be expected. An example of what one of my professors once told me about an LR(1) parser generator I wrote: 


  You have used somewhat too many instances of unneeded inheritance and virtuality. Inheritance makes a design much more complicated (and inefficient because of the RTTI (run-time type inference) subsystem), and it should therefore only be used where it makes sense, e.g. for the actions in the parse table. Because you make intensive use of templates, you practically don't need inheritance."


First of all, his rant is really nothing BUT a rant.  There's very little actual content here.  The only reason it's really famous or even mildly respected is that it was made by the Linux God.  His main argument is that C++ is crap and he likes to piss C++ people off.  There's of course no reason at all to respond to that and anyone who considers it a reasonable argument is beyond conversation anyway.
As to what might be gleamed as his most objective points:

STL and Boost are utter crap <- Whatever.
STL and Boost cause infinite amounts of pain <- He's purposefully over-exaggerating, but then what is his real statement here?  I don't know.  There's some more than-trivially difficult to figure out issues when you cause compiler vomit in Spirit or something, but it's no more or less difficult to figure out than debugging UB caused by misuse of C constructs like void*.
Abstract models encouraged by C++ are inefficient. <- Like what?  He never expands, never provides any examples of what he means, he just says it. Since I can't tell what he's referring to there's little point trying to "rebut" the statement.  It is a common mantra but that doesn't make it any more understandable or intelligible.
Correct use of C++ means you limit yourself to the C aspects. <- Actually the WORSE C++ code out there does this so I still don't know what he's talking about.

There's no intelligible argument being made about anything.  To expect a serious rebuttal of such nonsense is just plain silly.  I'm getting told to "expand" on a rebuttal of something that I'd be expected to expand upon if it where I who said it.  If you really, honestly look at what Torvalds said you'd see that he didn't actually say anything.
Just because God says it doesn't mean it makes any sense or should be taken any more seriously than if some random bozo said it.  Truth be told, God is just another random bozo.

Responding to the actual question:
Probably the worst, and most common, bad C++ practice is to treat it like C.  Continued use of C API functions like printf, gets (also considered bad in C), strtok, etc... not only fail to leverage the power provided by the tighter type system, they inevitably lead to further complications when trying to interact with "real" C++ code.  So basically, do exactly the opposite of what Torvalds is advising.
Learn to leverage the STL and Boost to gain further compile-time detection of bugs and to make your life easier in other, general ways (the boost tokenizer for example is both type-safe AND a better interface).  It is true that you'll have to learn how to read template errors, which is daunting at first, but (in my experience anyway) it's frankly much easier than trying to debug something that generates undefined behavior during runtime, which the C API makes quite easy to do.
Not to say that C is not as good.  I of course like C++ better.  C programmers like C better.  There are trade-offs and subjective likes at play.  There's also a lot of misinformation and FUD floating around.  I would say that there is more misinformation floating around about C++ but I'm biased in this regard.  For example, the "bloat" and "performance" problems C++ supposedly has aren't actually major issues most of the time and are certainly blown out of the proportions of reality.
As to the issues your professor is referring to, these are not unique to C++.  In OOP (and in generic programming) you want to prefer composition over inheritance.  Inheritance is the strongest possible coupling relationship that exists in all OO languages.  C++ adds one more that is stronger, friendship.  Polymorphic inheritance should be used to represent abstractions and "is-a" relationships, it should never be used for reuse.  This is the second largest mistake you can make in C++, and it's a pretty big one, but it's far from unique to the language.  You can create overly complex inheritance relationships in C# or Java too, and they'll have exactly the same problems.
