New 指针问题,基础不太好。。
我这样定义了一个结构体用来传递指针:
- C/C++ code
struct NodeParam{ CListCtrl* pList; CStrig str;};用这个动态数组进行管理
- C/C++ code
CArry <NodeParam*, NodeParam*> m_Node;
我动态创建一个CListCtrl:
- C/C++ code
CListCtrl* list = New CListCtrl;
想要将该指针放入动态数组m_Node中进行管理,于是:
- C/C++ code
NodeParam *pNode;pNode->pList = list;pNode->str = _T("");m_Node.Add(pNode);出现了问题, 指针没有初始化。。
于是我:
- C/C++ code
NodeParam *pNode = new NodeParam;
然后再复制就没有问题了。
我想知道,new NodeParam的这个空间是什么空间, New CListCtrl不是已经为控件分配指针了吗?
new NodeParam 是结构体的空间吧?
那最后资源释放的时候需要两个空间都释放吗?
m_Node.RemoveAll(); 这样不行吧?
需要:
- C/C++ code
for(){ NodeParam* pNode = m_Node.getat(i); CListCtrl* p = pNode->pList; delete p; delete pNode;}这样?
[解决办法]
NodeParam *pNode;只定义了变量并未分配空间,所以NodeParam *pNode = new NodeParam;是必须的。最后释放资源时2个空间都要释放,后面的代码是对的。
[解决办法]
需要分别释放
NodeParam结构有2个成员,一个指针,一个对象,在new NodeParam时,不会自动为指针成员分配内存
[解决办法]
是这样的。
第一个问题:new NodeParam是在动态区分配的空间,NodeParam *pNode;语句只是声明了一个指针,而指针没有指向任何位置,所以肯定要new 。在动态区分配的空间里才有 CListCtrl*和 CStrig 。
第二个问题:同上。
第三个问题:的确是都要释放。
第四个问题:要看你RemoveAll函数如何写了。
第五个问题:这样写可以。
赠送:_T("")可以在工程属性设置中设置为多字符集之后,就可以直接用""了。
最后:一定要给我分。
[解决办法]
为了更直观,可以给NodeParam添加2个构造函数:
- C/C++ code
NodeParam::NodeParam() : pList(NULL), str(_T("")){}NodeParam::NodeParam(CListCtrl *p, CString s) : str(s){ pList = p;}
[解决办法]
楼上几位说的对
你可以用CPtrArray
[解决办法]
像int,double这种数据,是从栈上分配的,new个指针,是从堆上分配
[解决办法]
可以赋值啊。
NodeParam obj;
NodeParam *pNode = &obj;
[解决办法]
是这样的:NodeParam *pNode;
pNode->pList = list;
错误并不是说pNode不可以直接赋值。pNode->pList = list语句的意思是:把pNode所指向的NodeParam 的空间里的pList赋值。但是现在pNode指向的东西却还不存在。所以更加无法赋值了。
你明白了吗?