📄 subject_28983.htm
字号:
<p>
序号:28983 发表者:晨风 发表日期:2003-01-27 10:59:10
<br>主题:请教CObArray和CPtrArray类的区别(急)
<br>内容:看了半天msdn,还是没有找出区别来,从字面上看,好像前者是存储的对象,而后者是对象的指针。但是前者好像也可以存储指针,搞晕了。向高手请教。
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:tjhe 回复日期:2003-01-27 18:16:01
<br>内容:这两者都是动态指针数组,只不过CObArray类是支持CObject指针地指针数组,CPtrArray类是支持void指针的指针数组。CPtrArray更具一般性。<BR><BR>见msdn中说明:<BR><BR>CObArray类支持CObject指针数组。这些对象数组近似于C中的数组,但不同的是它们可以动态地增减。数组索引总是开始于位置0。你可以决定是否固定数组上界,或当增加元素超过了当前边界后,是否允许数组扩展。内存分配给数组上界的邻近值,而不管某些元素是否为空。在Win32下, CObArray 对象的大小仅仅受限于有效的内存大小。与C数组类似,CObArray索引元素的访问时间是一个常量,与数组的大小独立。CObArray对象引入了IMPLEMENT_SERIAL宏,以支持其元素的串行化与转储。若CObject指针数组存储在一个档案文件中,那么或者使用加载插入(<<)操作符,或者使用Serialize成员函数,每个CObject元素都将按其索引依次被串行化。如果要了解有关实现数组中个别CObject元素的转储,那么必须将CDumpContext 对象的深度设置为1或更大。当CObArray 对象或其元素被删除,被删除的仅仅是CObject指针,而不是它们参考的对象。<BR><BR>注意 在使用数组之前,请使用SetSize来建立数组的大小,并为其分配内存。如果没有使用SetSize,那么向数组中增加元素将导致它频繁地重新分配和拷贝。频繁地重新分配和拷贝是没有效率的,并将产生内存碎片。<BR><BR><BR>CPtrArray类支持void指针数组。CPtrArray的成员函数类似于CObArray类的成员函数。由于这种相似,你可以利用CObArray参考文档作为成员函数的说明。无论在何处使用一个CObject指针作为函数参数或返回值,都可以将它替换成void。例如:CObject* CObArray::GetAt( int <nIndex> ) const;可以转换成:<BR>void* CPtrArray::GetAt( int <nIndex> ) const;CPtrArray嵌入IMPLEMENT_DYNAMIC宏来支持运行时类型访问和转储到一个CDumpContext对象。如果你需要转储个别的指针数组元素,你必须将转储环境的深度设置为1或更大。<BR>注意 在使用一个数组之前,先用SetSize函数建立数组的大小,并为数组分配内存。如果应用程序没有使用SetSize函数,则向数组中增加元素会使它被频繁地再分配和拷贝。频繁再分配和拷贝的效率很低,并且可能使内存变得很零碎。<BR>指针数组不能被串行化。当一个指针数组被删除时,或当其元素被删掉时,只删掉指针,而这些指针所引用的实体不被删除。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -