Another point (raised in the past by Nial and others) is to recommend that C++ "standard" APIs (such as those provided through "std::"):
* Prefer APIs that accept memory as-passed-in by the caller, rather than rely upon internal allocation semantics, or reliance upon allocators.
By defining APIs that demanded already-allocated-memory as parameters, we could:
(a) better control latency (e.g., the implementation does not even attempt an allocator-call with possibly variable-length duration)
(b) better leverage hardware-specific resources (e.g., hardware-specific APIs are leveraged external to the "std::" implementation)
I second this strongly, and have been wanting this for years in different real-time and low-latency contexts. (i.e. real-time robotics control and low-latency financial software.)
Related to this is: how the API should respond when passed in memory is exceeded should ideally be deferred to the consumer of the library.
For example, if a string concatenation operation would exceed the passed-in buffer size, then whether it should truncate the string, indicate an error (and how it does that), or do something else should nominally be specified by the user of the string.
Currently, I believe std::string will generally try to allocate more memory or error out if it can't allocate, where in many contexts truncation is sufficient, so I believe supporting this user-defined response behavior is an important part of supporting allowing the user to pass in external memory.
(I am working on a paper describing this issue of what should be considered an error and error handling, and how languages and libraries should in general support them. Short version: defer whether any low-level condition is considered an error to the high-level application wherever possible.)
I've ended up recreating API's like std::list and std::string to get this behavior, and it seems like a shame that the main API in std:: couldn't be leveraged to get this on top of an "even more arbitrary" buffer (i.e. one from the local call stack, supplied by the user) than it already allows (i.e. via allocators).