我在一个函数中使用new关键字分配了一块内存给对象,我会在另外一个函数中使用该对象,并且在该函数中使用完后将其删除,此时使用delete删除的时候就出现了上面的Assertion Failed!!typedef struct tagMYOBJECT {...} MYOBJECT, *LPMYOBJECT;void f1(LPOBJECT *lppmo)
{ *lppmo = new MYOBJECT;}void usemo(LPMYOBJECT lpmo)
{
// use the lpmo...
...
delete lpmo;
}
以上代码为示例代码!!!!
{ *lppmo = new MYOBJECT;}void usemo(LPMYOBJECT lpmo)
{
// use the lpmo...
...
delete lpmo;
}
以上代码为示例代码!!!!
wId = LOWORD(wParam);
switch (wId)
{
case IDOK:
case IDCANCEL:
{
// Free resource
LPSUBSYSINFO lpssi;
lpssi = (LPSUBSYSINFO) SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETITEMDATA, 0, 0);
MessageBoxV("%s", -1, lpssi->szSubsysName);
delete lpssi; // 只删除一个对象!!!!!!出错地方
EndDialog(hDlg, wId);
}
break; case IDC_CONNECT2DB:
if (Connect2DB("gistar", "gistar", "LNKFK"))
{
MessageBox("Connect ok!");
LPSUBSYSINFO pssi = NULL;
int nRtrvCnt;
int iIdx = 0;
RtrvSubsys(0, &pssi, &nRtrvCnt);
// Using query result
for (int i = 0; i < nRtrvCnt; i++)
{ // MessageBoxV("subsysid:\n %d", -1, (pssi + i)->iSubsysId);
iIdx = SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (pssi + i)->szSubsysName);
SendDlgItemMessage(hDlg, IDC_LIST1, LB_SETITEMDATA, iIdx, (LPARAM)(pssi + i));
}
// Free the memory
// delete[] pssi;
pssi = NULL;
}
else
MessageBox("Connect failed!");
break;
wId = LOWORD(wParam);
switch (wId)
{
case IDOK:
case IDCANCEL:
{
// Free resource
LPSUBSYSINFO lpssi;
lpssi = (LPSUBSYSINFO) SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETITEMDATA, 0, 0);
MessageBoxV("%s", -1, lpssi->szSubsysName);
delete lpssi;
//int nCnt = SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETCOUNT, 0, 0);
//for (int i = 0; i < nCnt; i++)
//{ lpssi = (LPSUBSYSINFO) SendDlgItemMessage(hDlg, IDC_LIST1, LB_GETITEMDATA, i, 0);
// delete[] lpssi;
//}
EndDialog(hDlg, wId);
}
break;case IDC_CONNECT2DB:
if (Connect2DB("gistar", "gistar", "LNKFK"))
{
MessageBox("Connect ok!");
LPSUBSYSINFO pssi = NULL;
int nRtrvCnt;
int iIdx = 0;
RtrvSubsys(0, &pssi, &nRtrvCnt);
// Using query result
for (int i = 0; i < nRtrvCnt; i++)
{ // MessageBoxV("subsysid:\n %d", -1, (pssi + i)->iSubsysId);
iIdx = SendDlgItemMessage(hDlg, IDC_LIST1, LB_ADDSTRING, 0, (LPARAM) (pssi + i)->szSubsysName);
SendDlgItemMessage(hDlg, IDC_LIST1, LB_SETITEMDATA, iIdx, (LPARAM)(pssi + i));
}
// Free the memory
// delete[] pssi;
pssi = NULL;
}
else
MessageBox("Connect failed!");
break;
在case IDC_CONNECT2DB:中就可以使用delete[]将所生成的的对象删除!不过这些对象也是在这部分声明的!但是在其他地方虽然能正确获得该指针,却不能删除!
int *p = new int[5];
delete (p + 2); // 试图删除第3个int对象,错误
delete[] p;
所以,如果在一个函数中生成对象,而在其他函数中使用并删除时,需要将该内存区域的起始地址保存起来,可以保存到全局变量、或Window对象中(如SetWindowLong(hwnd, GWL_USERDATA, (LONG) youdata))等。如果想删除该内存区域,先将该内存区域的首地址取出来再删之!