使用VC开发程序经验谈(二 续)(4)
void CShapeView::OnDraw(CDC* pDC)
{
CShapeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
{
CShape Shape;
CMyArc *pArc=new CMyArc(CMyXYZ(100,100,0),CMyXYZ(100,20,0),CMyXYZ(180,100,0));
Shape.m_List.insert(Shape.m_List.end(),pArc);
CMyPolyLn *pPolyln=new CMyPolyLn;
CMyXYZ xyz(1,1,0);
pPolyln->AddPoint(&xyz);
xyz.x=2;
xyz.y=2;
pPolyln->AddPoint(&xyz);
xyz.x=2;
xyz.y=1;
pPolyln->AddPoint(&xyz);
Shape.m_List.insert(Shape.m_List.end(),pPolyln);
Shape.Draw((long)pDC->m_hDC);
}
}
先不要急着运行,现在运行的话会出现一些断言的错误,这是由于你在主程序中new出来空间,而在DLL中释放而造成的(CShape的析构函数在DLL中释放内存),解决该问题的方法详细说明如下:
用GlobalAlloc()代替new, 用GlobalFree() 代替delete就不会出错了
其实还有一个办法,就是把dll的Settings的C/C++选项卡的Code Generation的Use Run-time liberary改成Debug Multithreaded DLL,在Release版本中改成Multithreaded DLL,就可以直接使用new和delete了,没问题
比较规范点的做法一般是DLL分配的内存由DLL释放。
这里采用设置Debug Multithreaded DLL的方法解决