1 LtCalibrateDlg::~LtCalibrateDlg()
2 {
3 if (m_pIplImageGray) cvReleaseImage(&m_pIplImageGray);
4
5 MYDELETE(m_pKeyboard);
6 MYDELETE(m_pNumKeyboard);
7
8 delete m_pView; // LtCalibrateView* 成员变量;
9 delete m_pScene; // QGraphicsScene* 成员变量;
10 delete m_pAboveWnd;
11
12 delete ui;
13 }
LtCalibrateDlg类中含有LtCalibrateView* 成员变量; QGraphicsScene* 成员变量; IplImage* 成员变量 etc.
1 LtCalibrateView::~LtCalibrateView()
2 {
3 MYDELETE(m_pCircle);
4 MYDELETE(m_pRing);
5 MYDELETE(m_pFitCircle);
6 MYDELETE(m_pLineRect);
7 MYDELETE(m_pFitLine);
8 if (m_pIplImageGray) cvReleaseImage(&m_pIplImageGray);
9 m_pDlg = NULL; // LtCalibrateView* 成员变量;
10 m_pScene = NULL; // QGraphicsScene* 成员变量;
11 }
LtCalibrateView类中含有LtCalibrateDlg* 成员变量; QGraphicsScene* 成员变量; IplImage* 成员变量 etc.
1 #define MYDELETE(p) {if (p) { delete p; p = NULL;}}
在该项目中(Smart2016):
有且只有一个 LtCalibrateDlg 型变量 和 LtCalibrateView 型变量,各自中相应类型的指针成员指向对方,共用同一个 scene ,即 俩者中的 m_pScene 指向同一份内存。(注意 view 和 dlg 中的 IplImage* 指向俩份不同内存
而 item 变量在 view 类中分配内存。故释放空间时(以 LtCalibrateDlg 窗口关闭为触发时机),先删除 view ,在其析构中回收 Item 内存,而只将 dlg 指针 和 scene 指针 置为 NULL(未 delete, 真正的 delete 操作在dlg
中)。而由于俩者的 IplImage* 成员指针指向不同内存,故直接删除即可。
ps: Qt中 delete scene 操作默认会执行 scene.clear(); 在执行相关操作时需注意