sTabName can't be a char array because (char*)::c_str() doesn't exist. On the other hand, std::string::c_str() *does* exist, so the fact that you refer to sTabName.c_str(); shows that sTabName isn't a char array, might be a std::string, and is definitely a class that defines c_str() even if it's not a std::string.

auto..sp(new SYS..) works because there is a constructor defined that takes a pointer to SYS.. (can't be bothered with all that typing, so using ".." to abbreviate the names)

On the other hand, there is no auto_ptr<SYS..>:perator=(SYS..*), so you get the error.

By the way, new T is fine; you don't need to do new (T). Actually the latter is the syntax for placement new, which you really don't want to start using yet. Get the simple stuff sorted before going onto that kind of stuff.

> memset is done to initialize it to '\0'

Yeah, I know what memset does. Let me try a parallel question:
int x; // x contains junk
x=0; // equivalent to your memset. We set it to zero.
x=2; // we wanted to initialise it to 2, but we felt we needed to initialise it to zero first.

In this code the x=0; is completely redundant; we can safely set x to 2 without having to set it to zero first. As is your memset call. Hence the question: why do you feel you need to do that?