对carray有点疑虑。
比如类
class A
{
public:
A();
~();
CString m_strName;
}
使用
CArray<A,A> arr;
A t;
t.name="test";
arr.add(t);
这样的代码有问题吗,arr[0]的m_strName的值会不会不是test

解决方案 »

  1.   

    不new的话可以么?本身CString就是指针的啊~测试一下吧
      

  2.   

    没有问题哈,CArray<A,A>没有问题啊,如果Carray<A*,A*>那就要new了,最后还得一个一个的弹出来delete
    但是一般我们都用carray<&a,&a>或Carray<A*,A*>,这样不用去考虑A的深拷贝问题,否则这样复制可能会有问题,例如CArray<A,A> array;array.add(a);array[0] = A'
      

  3.   

    CArray<A,A>和Carray<A*,A*>到没什么,A本身就是复制进去的一个副本吧~我担心的是CString这个家伙本身是指针,会不会他出问题,我觉得你搞个wchar_t的数组最好
      

  4.   

    如果A改成这样
    class A
    {
    public:
    A()
    {
    m_str=new TCHAR[20];
    }
    ~A()
    {
    delete []m_str;
    }
    CString m_strName;
    LPTSTR m_str;
    }
    就出问题了,奇怪。
      

  5.   

    在CArray的析构函数被调用时出问题
      

  6.   

    LPTSTR m_str;
    试试TCHAR * m_str;???
    m_str=new TCHAR[20];
      

  7.   

    自己结贴。如果成员是cstring 类型的话是不存在问题的,但是如果像7楼那样的话在add函的BUG就出来了,因为调用add函数时传递了一个对象。解释:
    class A
    {
    public:
    A()
    {
    m_str=new TCHAR[20];
    }
    ~A()
    {
    delete []m_str;
    }
    CString m_strName;
    LPTSTR m_str;
    }使用
    CArray<A,A> arr;
    A t; 这个地方调用了t构造函数,假设t.m_str的地址是0x00000001;
    t.name="test";
    arr.add(t); 这个地方add函数里会生成一个A的临时对象,假设是t1,t1.m_str=0x00000002;
    但是t1又被t赋值了(t1=t),也就是说t1.m_str又变成了0x00000001;  这样就出问题了,
    carray析构时会调用A的析构,那0x00000001又被delete了