C and C++ are historically relatively low level programming languages, meaning they leave a lot of responsibility with the developer for correct functioning. Fine-grained control over the allocation and deallocation of memory blocks is part of that, as garbage collection can have notable performance impacts, and is not always 'planned'. It also takes up overhead in costly resources as every allocated object needs to be reference counted and 'catalogued' for automated removal later on.
Java and C# are higher level languages, in that they sacrifice performance with things like garbage collection to offload the developer from those 'menial' tasks. This makes them more accessible for a broader array of tasks, and decreases development and debugging times for larger projects.
The end result is that all languages are different 'tools' in the programmer's toolbox. C and C++ incur little overhead, and are thus inherently highly capable of performance-intensive operations, such as drivers, low level OS code and game engines. C# and Java are more used for productivity software and web applications where split second performance is of less importance.