游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3604|回复: 5

求教:用动态数组保存含指针成员变量的类,delete之前可否

[复制链接]

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2009-8-23 17:13:00 | 显示全部楼层 |阅读模式
m_xModels 是一个保存类CXModel的动态数组,类CXModel中有指针成员变量  

           if(!m_xModels)
        {
                m_xModels = new CXModel[1];
        }
        else
        {
                CXModel *temp;

                temp = new CXModel[m_numXModels+1];
                memcpy(temp, m_xModels, sizeof(CXModel)*m_numXModels);
                     //ZeroMemory(m_xModels, sizeof(CXModel)*m_numXModels);
                delete []m_xModels;

                m_xModels = temp;
        }

如果不加注释,会有错误,于是我想用ZeroMemory把delete前的类中的指针全部初始为0,这样delete就不会删除原有的内存空间,程序是跑起来了.看了很多帖子没有这么做的.难道是因为有内存泄露?再三思索,也觉得不会导致内存泄露.

     求教:这么做可行吗?如果不可行请指点一下是什么原因

2

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2009-8-23 20:58:00 | 显示全部楼层

Re:求教:用动态数组保存含指针成员变量的类,delete之前可

LZ这是把C++用坏的经典样例。

C++区别于C的关键是抽象和封装,就是要避免你直接去操作内存,而你偏偏要直接去操作破坏封装。
C++对象是不能用memcpy复制的,而要用拷贝构造;不能用ZeroMemory释放,而要用析构。在有些情况下,比如LZ的例子,会显得比较浪费。但是,你的memcpy做法,只在简单情况下成立,也就是CXModel只是简单的类的情况下成立。

不成立的可能的情况太多了,比如:CXModel包含对其它model的指针或自己成员的指针;CXModel析构里有无条件执行的操作,比如删除对象、修改全局或静态变量、撤销注册事件等……

简单的说,C++的内存是不能随便移动的。

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2009-8-23 23:13:00 | 显示全部楼层

谢谢,但是你好像不是很理解我的意思

我的意思是要把原有动态数组的n个对象值,拷贝到新数组的前n个成员中,并不是要释放他,因为他的指针控件我任然需要,我把原始数据zeromemry,是想让其成员指针所指的内存为空,原有的指向有新数据进行指向.我之所以没有用复制构造是因为原有内存区已由新的动态数组中的成员指针指向,原则上,那块内存还是那块内存,只是指向他的指针换了

2

主题

123

帖子

123

积分

注册会员

Rank: 2

积分
123
发表于 2009-8-24 09:32:00 | 显示全部楼层

Re:求教:用动态数组保存含指针成员变量的类,delete之前可

无语……
ZeroMemory了delete []m_xModels时就不调析构了么?new一个新数组会和原来的数组是同一块内存?

1

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2009-8-24 14:52:00 | 显示全部楼层

Re:求教:用动态数组保存含指针成员变量的类,delete之前可

我并没有new一个新空间,而是新数组的指针指向原来的那片空间,做一个过渡罢了,用delete根本就访问不到那片原有的空间

3

主题

14

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2009-8-24 15:34:00 | 显示全部楼层

楼主真TM是神仙

常用法如下:
class CTest;
std::vector<CTest*> _vecTest;
std::vector<CTest*> _vecBak;
//在_vecTest塞满CTest
for(int _iCounter = 0;_iCounter < 512;++_iCounter)
{
_vecTest.push_back(new CTest);
}

//拷贝到VECBAK
std::copy(_vecTest.begin(),_vecTest.end(),std::back_inserter(_vecBak));
//清除_vecTest;
_vecTest.clear();

//......

//删除_vecBak;
for(int _nCounter = 0;_nCounter < static_cast<int>(_vecBak.size());++_nCounter)
{
if(_vecBak[_nCounter] != NULL)
{
delete _vecBak[_nCounter];
}
_vecBak.clear();




///对象可以使用智能指针包装过的对象,智能指针可以使用boost中的,当然我一般不怎么用.
///动态数组就用vector或者deque之类的容器就可以了,不用自己去写.
///
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 04:57

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表