Raw pointers create maintenance burdens. You must track which pointer owns memory and is responsible for deletion. You must ensure delete happens on every code path including exceptions.
Ownership transfer is ambiguous. When you pass a pointer to a function, does the function delete it? Documentation can say, but the type system doesn't enforce it. Smart pointers solve these problems.
Ownership is explicit in the type. unique_ptr means one owner, shared_ptr means shared. Deletion happens automatically. Code is simpler and safer.