Ubicación de escritura de violación de acceso cuando se trabaja con punteros para char

Estoy escribiendo un programa muy simple que elimina caracteres duplicados de una cadena. Lo ejecuté en Visual Studio y obtuve el error:

Excepción no controlada en 0x00d110d9 en inteviews.exe: 0xC0000005: Ubicación de escritura de infracción de acceso 0x00d27830.

Realmente no veo cuál es el problema. La celda actual obtiene el valor de la siguiente celda.

void remove(char *str, char a) {
    while (*str != '\0') {
        if (*(str+1) == a) {
            remove(str + 1, a);
        }

        *str = *(str +1 );//HERE I GET THE ERROR
        ++str;
    }
}


int _tmain(int argc, _TCHAR* argv[])
{
    char *str = "abcad";

    while (*str != '\0') {
        remove(str,*str);
        str++;
    }

    std::cout << str << std::endl;

    return 0;
}

EDITAR

Ya intenté cambiarlo achar str[] = "abcad" pero sigo teniendo el mismo error.

Respuestas a la pregunta(6)

Su respuesta a la pregunta