MFC的CArray是如何进行内存拷贝的

you都是我的 2016-03-30 09:51:06

class CTest
{
public:
CTest()
{
int i = 0;
for (i = 0; i < 100; i++)
{
m_ven.push_back(i);
}
}
public:
int *m_pN;
vector<int> m_ven;

};
main()
{
CArray<CTest, CTest&> cTestArray;
int i = 0;
for (i = 0; i < 10; i++)
{
CTest ct;
cTestArray.Add(ct);
}
}

如上述一段代码所示当CArray的内存不够时会重新申请内存,并且将原有的数据拷贝入新的内存空间中,这个拷贝是调用的memcpy所以这一段内存是连续的,但是CTest类中成员变量vector类型的m_ven中的数据也在这一段连续的内存中吗,m_ven中保存数据的空间也是new出来的,一定会在被拷贝的内存空间中吗?
...全文
258 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
you都是我的 2016-03-30
  • 打赏
  • 举报
回复
m_ven中new出来的空间并不一定在memcpy要拷贝的空间中,这个无所谓,因为memcpy拷贝的这一段内存中并不涉及类中new出来的内存空间,这一段连续的内存中只是保存着类中的成员变量的类型所占用的空间大小,比如这个CTest类sizeof大小为4+20=24个字节,4为指针变量的大小,20为那个vector变量的大小,当CArray将这些原有的数据拷贝入新申请的内存空间后,就会调用delete[]删除原有的这些空间,但不会调用调用类的析构函数所以类中new出来的内存依然存在(即vector中new出来的空间依然存在不会被CArray给删除掉),所以当我们在CArray中访问vector中的数据时,依然可以访问就是这个原因,下面是CArray删除旧有内存的源代码片段:

// get rid of old stuff (note: no destructors called)//注意这句话(并没有调用类的析构函数)
delete[] (BYTE*)m_pData;//事实也确实如此
m_pData = pNewData;
m_nSize = nNewSize;
m_nMaxSize = nNewMax;

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧