You're arguing that C++ makes safety improvements over C. I broadly agree, but that's not the topic at hand. C++ is still quite plainly not a safe language.
Whether it's safer than C isn't the point, but this causes undefined behaviour in both C and C++:
int i;
int j = i;
as does this statement: int i = 1 / 0;
as does: int i = INT_MIN * -1;
as does: int i = INT_MAX + 1;
> There are ways of using C++ that are entirely safe, along those lines. [...] No C arrays, no C pointers.Practically speaking, no, there are not. As I showed above, it's not just arrays and pointers that have safety issues in C and C++. I've rambled before about how there's no practical way to entirely avoid the unsafety pitfalls of C and C++ (short of formal verification). [0][1]
Compare this against the Safe Rust subset of Rust. Safe Rust really is a safe language, at least by their (very strong) definition of the term as guaranteed to be free of undefined behaviour. [2] It's not possible to define a practical subset of C or C++ with this property.
[0] https://news.ycombinator.com/item?id=26307709
[1] https://news.ycombinator.com/item?id=30597750
[2] https://doc.rust-lang.org/nomicon/meet-safe-and-unsafe.html