求助 关于delete[]的char *问题,在重载操作符"=", 程序崩溃。希望大家帮忙一起探讨下

#include "stdafx.h"
#include
#include

int strLen(char * pSrc)
{
if (nullptr == pSrc)
{
return 0;
}
int nLen = 0;
char * pTemp = pSrc;
while (*pTemp != '\0')
{
nLen++;
pTemp++;
}
return nLen;
}

char * strCopy(char * dest, const char * src)
{

if (dest == nullptr || src == nullptr)
{
    return nullptr;
}

if (dest == src)
{
    return dest;
}
char * tmp = dest;
while (*src != '\0')
{
    *tmp++ = *src++;
}
return dest;

}

char * strCat(char * pDst, char * pSrc)
{
if (pDst == nullptr || pSrc == nullptr)
{
return nullptr;
}
char * pTemp = pDst + strLen(pDst);
while (*pSrc != '\0')
{
*pTemp++ = *pSrc++;
}
*pTemp = '\0';
return pDst;
}

class String
{
public:
String(char *pData = nullptr)
{
if (nullptr == pData)
{
m_pChar = new char[1];
assert(nullptr != m_pChar);
m_pChar = '\0';
}
else
{
m_pChar = new char[strLen(pData) + 1];
assert(nullptr != m_pChar);
memset(m_pChar, 0, strLen(m_pChar));
strCopy(m_pChar, pData);
}
}

~String()
{
    if (nullptr != m_pChar)
    {
        delete[] m_pChar;
        m_pChar = nullptr;
    }
}

String(const String &Other)
{
    m_pChar = new char[strLen(Other.m_pChar) + 1];
    assert(nullptr != m_pChar);
    memset(m_pChar, 0, strLen(m_pChar));
    strCopy(m_pChar, Other.m_pChar);
}
const String& operator =(const String &Other)
{
    if (this == &Other)
    {
        return *this;
    }
    delete[] m_pChar;
    m_pChar = new char[strLen(Other.m_pChar) + 1];
    assert(nullptr != m_pChar);
    memset(m_pChar, 0, strLen(m_pChar));
    strCopy(m_pChar, Other.m_pChar);
    return *this;
}

private:
char * m_pChar;
};

int _tmain(int argc, _TCHAR* argv[])
{
String str = "123";
str = "456";
return 0;
}

在函数const String& operator =(const String &Other)中,delete[] m_pChar;这一句崩溃。