一个诡异的C++程序有关问题

一个诡异的C++程序问题,求高手指教
问题1:wcout无法输出宽字符串
问题2:程序运行退出时会弹出错误对话框


// Proxy.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <windows.h>
#include <iostream>


class CSchoolGirl
{
public:
CSchoolGirl():m_pName(0)
{
m_pName = new wchar_t[20];
}
virtual~CSchoolGirl()
{
if (m_pName)
{
delete m_pName;
m_pName = NULL;
}
}

public:
bool SetGirlName(wchar_t* pName)
{
if (m_pName!=NULL && pName!=NULL)
{
wcscpy_s(m_pName, 20, pName);
return true;
}
return false;

}
wchar_t* GetGirlName()
{
return m_pName;
}
private:
wchar_t *m_pName;
};

/////////////////////////////////////////////
class CGiveGift
{
public:
virtual void GiveDolls() = 0;
virtual void GiveFlowers() = 0;
virtual void GiveChocolate() = 0;
};

/////////////////////////////////////////////
class CPursuit:public CGiveGift
{
public:
CPursuit(CSchoolGirl &mm)
{
m_MM = mm;
}
virtual~CPursuit() 
{
}

public:
virtual void GiveDolls()
{
wchar_t *pWstr = NULL;
pWstr = m_MM.GetGirlName();
// 输不出来 ????
std::wcout << pWstr << L"送你洋娃娃" << std::endl;
}
virtual void GiveFlowers()
{
wchar_t *pWstr = NULL;
pWstr = m_MM.GetGirlName();
// 输不出来 ????
std::wcout << pWstr << L"送你鲜花" << std::endl;
}
virtual void GiveChocolate()
{
wchar_t *pWstr = NULL;
pWstr = m_MM.GetGirlName();
// 输不出来 ????
std::wcout << pWstr << L"送你巧克力" << std::endl;
}

private:
CSchoolGirl m_MM;
};

/////////////////////////////////////////////
class CProxy : CGiveGift
{
public:
CProxy(CSchoolGirl &mm):m_pGG(0)
{
m_pGG = new CPursuit(mm);

}
virtual~CProxy()
{
if (m_pGG)
{
delete m_pGG;
m_pGG = NULL;
}
}

public:
virtual void GiveDolls()
{
m_pGG->GiveDolls();
}
virtual void GiveFlowers()
{
m_pGG->GiveFlowers();
}
virtual void GiveChocolate()
{
m_pGG->GiveChocolate();
}
private:
CPursuit *m_pGG;

};

int _tmain(int argc, _TCHAR* argv[])
{
CSchoolGirl mm;
mm.SetGirlName(L"王娇娇");
CProxy MyProxy(mm);
MyProxy.GiveDolls();
MyProxy.GiveFlowers();
MyProxy.GiveChocolate();

return 0;
}



------解决方案--------------------
引用:
virtual~CSchoolGirl()
    {
        if (m_pName)
        {
            delete m_pName;
            m_pName = NULL;
        }
    }

我觉得你C++ 还没有入门!


楼主用的POD类型,这样也是可以的,只能说习惯不好
------解决方案--------------------
你好,wcout 不输出的问题是在于,wcout是不默认输出中文的。需要修改一下,你可以参考这个博客。
http://blog.csdn.net/liziyun537/article/details/6024512

至于最后的报错,感觉是内存问题,有可能是析构函数的问题。但是按1楼的方法修改后,没有避免报错。
准备去吃饭,吃完饭回来再研究你的代码。如果楼主有了结果也请回复
------解决方案--------------------
你好,吃完饭回来看了一下,原因是
你在CPursuit  中使用了赋值符 = 
CPursuit(CSchoolGirl &mm)
{
m_MM = mm;
}
但是你在 CSchoolGirl类 中并没有对 赋值符进行重载,所以调用了默认的,然后析构的时候删除了 m_pName 占用的空间两次。
所以加上这个就好了。
CSchoolGirl& operator = (const CSchoolGirl& c)
{
m_pName = new wchar_t[20];
wcscpy_s(m_pName, 20, c.m_pName);
cout << "CSchoolGirl赋值符重载" << endl;
return *this;
}