C++中如何防止在类外部来delete掉类内部的指针成员?

来源:百度知道 编辑:UC知道 时间:2024/09/18 17:55:17
假设一个类,它含有一个public指针成员pi,pi用new申请了一段内存,在main函数中用delete来释放pi,这样还真能释放!那么用什么方式能阻止在类外用delete释放pi呢?
请高手指点,多谢!

变成私有的,然后增加一个访问函数,例如:

class Sample
{
private:
int*pi;
public:
Sample(){pi=new int(3);}
~Sample(){delete pi;}
int pi(){return *pi;}
};

但是这样就不能访问指针pi了,只能访问指针的指向的值。

为什么要阻止? 谁分配谁释放这是一般规则, 如果你遇上一个非要找茬的, 难道你能阻止他做一切错事么?

编程就要管好自己写的每一句, 语法和结构上只是尽量防止你不小心做错事而已。 不该自己delete的东西非要去delete, 这已经超出“不小心”的范畴了

这个问题,在游戏便成里面经常用到,具体情况是这样的:
创建D3D的时候会创建一个设备指针:
LPDIRECT3DDEVICE9 m_pDevice;
而其他类,比如渲染一个天空盒的时候,需要用到这个指针,于是在天空盒类里面创建如下一个指针:
LPDIRECT3DDEVICE9 m_pDeviceSky;

如果在天空盒里面使用了delete m_pDeviceSky; 那么在继续使用delete m_pDevice;不会出现问题,但是后来在使用这个指针的时候即使错误的,因为指针指向的内容已经不存在。
为了避免这个问题,D3D引入一个叫计数器的东西,就是为指向该内存的指针添加引用次数,直到引用次数为0的时候才真正删除内存内容。

另外强调的是,如果该指针指向的内容被多个类使用,那么很难避免被别的类释放掉这块内存,除非使用的时候注意,就像上面天空盒的情况,天空盒析构函数只需要让m_pDeviceSky = NULL.最后内存的内容谁来创建由谁来释放.

释放 当然任何时候都能释放,只要执行到释放的代码,内存空间才不管你什么主函数不主函数的..至于你说的 用什么方式能阻止在类外释放,这个就不知道了,虽然类里的私有数据成员是 只能通过成员函数或友元函数 来访问,但是数据成员是不能建立指针的,因为 类只是说明 类型 并不分配任何内存