我这样定义了一个结构体用来传递指针:
struct NodeParam
{
    CListCtrl* pList;
    CStrig str;
};
用这个动态数组进行管理
CArry <NodeParam*, NodeParam*> m_Node;
我动态创建一个CListCtrl:
CListCtrl* list = New CListCtrl;
想要将该指针放入动态数组m_Node中进行管理,于是:
NodeParam *pNode;
pNode->pList = list;
pNode->str = _T("");
m_Node.Add(pNode);
出现了问题, 指针没有初始化。。
于是我:
NodeParam *pNode = new NodeParam;
然后再复制就没有问题了。
我想知道,new NodeParam的这个空间是什么空间, New CListCtrl不是已经为控件分配指针了吗?
new NodeParam 是结构体的空间吧?
那最后资源释放的时候需要两个空间都释放吗?
m_Node.RemoveAll(); 这样不行吧?需要:
for()
{
     NodeParam* pNode = m_Node.getat(i);
     CListCtrl* p = pNode->pList;
     delete p;
     delete pNode;
}
这样?

解决方案 »

  1.   

    NodeParam *pNode;只定义了变量并未分配空间,所以NodeParam *pNode = new NodeParam;是必须的。最后释放资源时2个空间都要释放,后面的代码是对的。
      

  2.   

    需要分别释放NodeParam结构有2个成员,一个指针,一个对象,在new NodeParam时,不会自动为指针成员分配内存
      

  3.   

    是这样的。
    第一个问题:new NodeParam是在动态区分配的空间,NodeParam *pNode;语句只是声明了一个指针,而指针没有指向任何位置,所以肯定要new 。在动态区分配的空间里才有 CListCtrl*和 CStrig 。
    第二个问题:同上。
    第三个问题:的确是都要释放。
    第四个问题:要看你RemoveAll函数如何写了。
    第五个问题:这样写可以。
    赠送:_T("")可以在工程属性设置中设置为多字符集之后,就可以直接用""了。最后:一定要给我分。
      

  4.   

    为了更直观,可以给NodeParam添加2个构造函数:
    NodeParam::NodeParam() : pList(NULL), str(_T(""))
    {
    }NodeParam::NodeParam(CListCtrl *p, CString s) : str(s)
    {
      pList = p;
    }
      

  5.   

    楼上几位说的对你可以用CPtrArray
      

  6.   


    那么内置类型 int double ……
    他们在定义的时候是已经分配了空间了吗?
    int i= 0;
    int *n = null;
    n = &i;
    不需要 new  是这个原因吗?
      

  7.   


    那内置类型 int double 什么的是在定义的时候就分配空间了吗?
    int i = 0;
    int *p = null;
    p = &i; 这样就没有问题,不需要new。 
      

  8.   

    像int,double这种数据,是从栈上分配的,new个指针,是从堆上分配
      

  9.   


    我的意思是int *p 可以直接赋值 , NodeParam *pNode 为什么就不可以。
      

  10.   

    可以赋值啊。
    NodeParam obj;
    NodeParam *pNode = &obj;
      

  11.   

    是这样的:NodeParam *pNode;
    pNode->pList = list;
    错误并不是说pNode不可以直接赋值。pNode->pList = list语句的意思是:把pNode所指向的NodeParam 的空间里的pList赋值。但是现在pNode指向的东西却还不存在。所以更加无法赋值了。
    你明白了吗?