同一台机器上,在两个不同的工程中,定义了
typedef CList<CString, CString&> CIpList;
然后进去后,写同样的代码
CIpList *pList = new pCIpList;
delete pList;
pList = NULL;
在一个项目中可以正确运行,但在另一个项目中,即在delete时,总报"Microsoft   Visual   C++   Debug   Library   
  Debug   Assertion   failed!   
  ...   
  Expression:   _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)   "之类的信息。PS:指针生成后,没有做任何操作,直接删除,故此可以排除是内存被改写的问题,请问这是否项目设置有关么?

解决方案 »

  1.   

    CIpList *pList = new pCIpList;
    if(pList!=NULL)        //是否分配成功
      

  2.   

    CIpList *pList = new pCIpList;
    if(pList!=NULL)        //是否分配成功如果pList==NULL,这时去delete就会报错
      

  3.   

    这里的代码没错, 是其他地方的越界范围把pList的内容破坏掉了所以这里就出错, 应该是其他地方代码的问题
      

  4.   

    CIpList *pList = new pCIpList;
    if(pList!=NULL)        //是否分配成功--------------------
    vc对new失败也是抛出bad_alloc异常,不是返回NULL。
    如果你同样的操作在另外一个项目中没问题
    哪应该就是项目的设置问题。
      

  5.   

    有没有跨线程,或dll开内存,exe释放的问题??
    最好谁负责new ,就由谁负责delete
      

  6.   

    问题应该是typedef CList<CString, CString&> CIpList;造成的,把CString 改成LPCSTR后应该不会出问题。
      

  7.   

    对,我也怀疑你在其他的地方有内存溢出的现象,
    你在Delete时做下判断:
    if( pList!=NULL )
    {
        //也可以打出Log看看
        delete pList;
    }
      

  8.   

    如果是我说的情况,不要用标准的new delete ,自己做new 和 delete
    or
    直接call GlobalAlloc GlobalFree
      

  9.   

    1\对于对象来说,如果不是自己写的new和delete,没有必要判断是否为NULL,应该可以直接删除,
    2\用if(NULL!=pList)用来判断是否为野指针
    3\多线程情况下容易出现LZ说的这种情况,因为CIpList中的内容可能发生改变.
    4\另外在list中使用CString没有任何问题,我经常这样来使用.
      

  10.   

    typedef CList<CString, CString&> CIpList,它表示你存在链表里的是CString,也就是说在你的链表里存放的是CString的Buffer,CString&表示你对链表的操作都是直接对Buffer操作,所以这是很危险的,因为可以访问你链表的地方都可以破坏链表,你最好查查是不是在别的地方对链表进行了人为的破坏。
      

  11.   

    1、在同一个函数里(其实是写的测试代码),没有多线程,分配完后立马delete;
    2、分配是成功的(有单步跟踪);
    3、既然是没有启动多线程,并且分配后立马删除,也应该不会存在内存越界等问题吧?苦恼,一直不知什么原因……
      

  12.   

    项目是类似的,只是把以前的Server和Client换一下功能,即现在的Server是以前Client的功能,现在的Client是以前的Server功能。所以其实代码都是直接拷贝的。