If you compare the logic of your copy constructor and copy assignment operator, you would find that it is very similiar. In fact, you can write your copy assignment operator in terms of your copy constructor by providing a swap member function, e.g.,
Code:
void Name::swap(const Name& nm)
{
    using std::swap;       // Swap manually if you are not allowed to use this.
    swap(name, nm.name);   // Cheap swapping: swap the pointers.
    swap(sname, nm.sname);
}

Name& Name::operator=(const Name& nm)
{
    if (this != &nm)
    {
        Name temp(nm);
        swap(nm);
    }
    return *this;
}
Unlike the copy assignment operator you have now, there is no delete[]. The reason is that the temporary is destroyed in the function, so the destructor does the delete[] for you.