我在一个函数中使用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;
}
以上代码为示例代码!!!!

解决方案 »

  1.   

    还是看实际代码吧!
    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;
      

  2.   

    重新来过。。
    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;
      

  3.   

    但是不管使用delete还是delete[]都会出现相同的错误!
    在case IDC_CONNECT2DB:中就可以使用delete[]将所生成的的对象删除!不过这些对象也是在这部分声明的!但是在其他地方虽然能正确获得该指针,却不能删除!
      

  4.   

    是不是应该先delete *lpmo;再delete lpmo呢
      

  5.   

    new/delete对应该在同一线程空间内成对使用.
      

  6.   

    当试图删除一片连续内存块中的特定对象时,会出现上面的Assertion Failed!连续内存区域只能对该块内存的起始地址进行删除!如:
    int *p = new int[5];
    delete (p + 2);  // 试图删除第3个int对象,错误
    delete[] p;
    所以,如果在一个函数中生成对象,而在其他函数中使用并删除时,需要将该内存区域的起始地址保存起来,可以保存到全局变量、或Window对象中(如SetWindowLong(hwnd, GWL_USERDATA, (LONG) youdata))等。如果想删除该内存区域,先将该内存区域的首地址取出来再删之!