3 ms·
> Great, here you go. As I pointed out, your drop_new is broken for copyable types. For example, consider std::array: auto w = std::array<int, 3>{0, 1, 2}
by aw1621107 1y ago
> Great, here you go.
As I pointed out, your drop_new is broken for copyable types. For example, consider std::array:
auto w = std::array<int, 3>{0, 1, 2};
drop_new(std::move(w));
std::cerr << w[0] << ", " << w[1] << ", " << w[2] << '\n';
This prints "0, 1, 2". Rust's drop() doesn't suffer from this flaw.
> And yes, the compiler will not prevent you from using this value.
Yes, that is the point!
This bit:
std::vector<int> vec {1, 2, 3};
drop_new(std::move(vec));
std::cerr << vec.size() << " <- ?\n";
Simply does not compile in Rust [0]:
let vec = vec![1, 2, 3];
drop(vec);
println!("{0} <- ?", vec.len()); // error[E0382]: borrow of moved value: `vec`
[0]: https://rust.godbolt.org/z/GjcMYnEzq https://rust.godbolt.org/z/GjcMYnEzq
> But clang static analyzer will happily detect it.
One problem is that you're not guaranteed to catch it, similarly to why static analyzers aren't guaranteed to catch use-after-frees.