Чтобы ответить на второй вопрос, если у вас есть структура
struct G {
std::shared_ptr<T> ptr;
};
, которая содержит умный указатель в качестве члена, тогда выполнение
G g;
std::memset(&g, 0, sizeof(G));
определенно не безопасно, потому что вы перезаписать g.ptr
объект не-POD типа, который уже был создан.
Что вы можете сделать, это примерно так:
std::aligned_storage_t<sizeof(G), alignof(G)> storage; // Raw storage of some POD type
std::memset(&storage, 0, sizeof(G));
auto g = new (&storage) G;
g->ptr = std::make_shared ... ;
// ...
std::destroy_at(g);
Нет причин использовать memset
в этом конкретном примере, но это законно и безопасно.