// 定义常量字符串
const CString Element = _T( "abcdefg" );    
// 添加元素
CStringArray* pcstringarray = new CStringArray;
    for (int i = 0; i < 1000; i++)
    {
        for (int j = 0; j < 1000; j++ )
        {
            pcstringarray->Add(Element);
        }
    }
...........    pcstringarray->RemoveAll();请问这样释放可以保证里面每个元素的内存都释放了吗?如果是的话,为什么我看任务管理器里面的内存还是增长了呢?

解决方案 »

  1.   

    还应该:
    if (pcstringarray)
    {
        delete pcstringarray;
        pcstringarray = NULL;
    }
      

  2.   

    因为你分配内存的时候不是使用API 来分配的,所通过运行库分配内存。
    所以归还的时候仅仅是归还给运行库,而运行库有权保留内存不归还操作系统,以便下次分配的时候快速分配。
    这也就是为啥要快速分配内存的时候用内存池。
      

  3.   

    关于RemoveAll()的解释:
    Removes all the pointers from this array but does not actually delete the CObject objects.
      

  4.   

    2楼的能解释的再详细一些吗?
    1.上面这样的问题有内存泄漏吗?
    2.如何使用API分配内存谢谢另外
    不用RemoveAll,而用1楼的
         delete pcstringarray; 
        pcstringarray = NULL;
    效果是一样的吗?即
    // 定义常量字符串 
    const CString Element = _T( "abcdefg" );      
    // 添加元素 
    CStringArray* pcstringarray = new CStringArray; 
        for (int i = 0; i  < 1000; i++) 
        { 
            for (int j = 0; j  < 1000; j++ ) 
            { 
                pcstringarray-> Add(Element); 
            } 
        } 
    ........... 
         delete pcstringarray; 
        pcstringarray = NULL;
      

  5.   

    你new了一个CStringArray对象而没有用delete释放,肯定会有内存泄漏不用removeall的话不会有问题的,但后面再用的时候里面已经有元素了,要注意
      

  6.   

    // 定义常量字符串 
    const CString Element = _T( "abcdefg" );      
    // 添加元素 
    CStringArray* pcstringarray = new CStringArray; 
        for (int i = 0; i  < 1000; i++) 
        { 
            for (int j = 0; j  < 1000; j++ ) 
            { 
                pcstringarray-> Add(Element); 
            } 
        } 
    ...........     pcstringarray-> RemoveAll(); if (pcstringarray) 

        delete pcstringarray; 
        pcstringarray = NULL; 
    }这样还会有内存泄漏吗?总感觉里面的元素没有释放内存啊
      

  7.   

    GlobalAlloc
    最好使用运行库分配内存
    只要不内存泄露就好。
      

  8.   

    刚刚突然发现MSDN里面Add的定义是
    int Add( CObject* newElement );
    throw( CMemoryException );要求的是指针类型作为参数,上面的是用一个字符串常量作为参数这样在RemoveAll的时候,担心元素的对象就没有被释放啊因为RemoveAll只是清空元素的指针,元素本身没有被释放啊不知道那部分会不会引起内存泄漏啊
      

  9.   

    刚刚看了一下代码,你的用法不对
    CArray<CString,CString&> array;
    这样的
      

  10.   

    刚才说的有误
    CStringArray内存分配都在 CStringArray::SetSize里面
    里面的内存是确定已经释放了。
      

  11.   

    首先谢谢11楼的建议,可是这段代码是在一个大的工程里的一段传递的参数的要求就是CStringArray*
    所以才这样用:
    CStringArray* pcstringarray = new CStringArray;现在的问题就是这样用以后不知道应该怎么释放还有10楼的问题并没有解决啊
      

  12.   

    在RemoveAll的时候会将所有内存释放了RemoveAll的时候会调用以下代码
                    _DestructElements(m_pData, m_nSize);
                    delete[] (BYTE*)m_pData;
                    m_pData = NULL;
                    m_nSize = m_nMaxSize = 0;static inline void DestructElement(CString* pOldData)
    {
            ENSURE_ARG(pOldData!=NULL);
            pOldData->~CString();
    }static void _DestructElements(CString* pOldData, INT_PTR nCount)
    {
            ASSERT(nCount >= 0);        while (nCount--)
            {
                    DestructElement(pOldData);
                    pOldData++;
            }
    }上面代码都是摘自MFC的实现代码。