包含在堆上分配的对象的指针类的基理
2008-09-10 20:18
120 查看
FAQ2.21
(1)总的观点:努力避免这种状况,(2)如果无法避免,使用auto_ptr.
尽量避免包含在堆上分配的对象的指针.例如,分析一下一个car类包含一个engine的情行。这儿有两个选择:教好的方式是engined对象直接嵌入到car对象内,不好的方式是car对象包含一个指向engine对象的指针,car从堆分配engine对象,下面是例子:
(1)总的观点:努力避免这种状况,(2)如果无法避免,使用auto_ptr.
尽量避免包含在堆上分配的对象的指针.例如,分析一下一个car类包含一个engine的情行。这儿有两个选择:教好的方式是engined对象直接嵌入到car对象内,不好的方式是car对象包含一个指向engine对象的指针,car从堆分配engine对象,下面是例子:
#include<iostream> usingnamespacestd; classEngine{ public: Engine(); virtualvoidstart(); }; Engine::Engine() { cout<<"Engineconstructor/n"; } voidEngine::start() { cout<<"Engine::start()/n"; }
car类的代码在下面,Car类,用更好的方法:每个Car对象直接包含它的Engine对象.与用在堆上分配的指向Engine对象
的指针相比较,类car展示的技术更容易,更快,更安全,并且使用更少的内存。
classCar{
public:
Car();
virtualvoidstartEngine();
protected:
Enginee_;<--1
};
Car::Car()
:e_()<--2
{
//Intentionallyleftblank
}
voidCar::startEngine()
{
e_.start();<--3
}
(1)每一个Engin嵌入到一个Car对象中
(2)初始化Car对象中的Engine对象
(3)调用Engin对象的start()成员函数
尽管这是很好的方法,有时候也不是必要的,从堆上分配内部对象并且有一个外部对象包含一个指向内部对象的指针,这时候就需要使用auto_ptr:
#include<memory><--1
usingnamespacestd;
typedefauto_ptr<Engine>EnginePtr;
classCar{
public:
Car();
virtualvoidstartEngine();
virtual~Car();
Car(constCar&c);<--2
Car&operator=(constCar&c);<--3
protected:
EnginePtrp_;<--4
};
Car::Car()
:p_(newEngine())<--5
{
//Intentionallyleftblank
}
voidCar::startEngine()
{
p_->start();<--6
}
(1)得到auto_ptr
(2)拷贝构造函数
(3)重载操作符
(4)每个Car对象包含一个auto_ptr指针
(5)为每个Car对象分配一个Engine对象
(6)为Engine对象调用start()成员函数
逻辑上第二个例子仍然是一个包含或者has-a的关系,但是实际上还是有些不同.注意三个扩展成员函数必须在Car
类的第二个版本中声明.需要扩展成员函数是因为auto_ptr被用来控制car的Engine对象。
最重要的信息是这比使用原始的指针危险性更小,就象Car*。因此下面的技术不应当被使用。
classCar{
public:
Car();
virtualvoidstartEngine();
virtual~Car();
Car(constCar&c);<--1
Car&operator=(constCar&c);<--2
protected:
Engine*p_;<--3
(1)拷贝构造函数
(2)重载操作符
(3)尽量避免原始指针分配对象。
相关文章推荐
- c++ 学习笔记(47)-C++中两个类中互相包含对方对象的指针问题
- Effective STL 第7条:如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉
- MFC自定义类中类成员包含动态指针时类对象的“=”赋值操作
- C++类对象创建过程(分配空间、赋值和初始化、对象初始化顺序、虚函数表指针)
- 内存泄露(包含循环引用)和野指针(僵尸对象)
- C++中两个类中互相包含对方对象的指针问题(转载)
- C++虚拟继承中_对象内存的分布_虚继承会多余分配虚表v-tab的指针vptr_图1-1清楚的描述了虚继承类对象内存的分布_转载淘宝共享数据平台
- Qt C++ 指向对象的指针与内存分配的问题分析
- C++类对象创建过程(分配空间、赋值和初始化、对象初始化顺序、虚函数表指针)
- 类对象可以直接赋值,但数据成员包含指针时 慎重
- 包含双重指针的结构体指针的分配内存与释放内存
- C++中两个类中互相包含对方对象的指针问题
- Java中堆内存和栈内存_在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)。修改栈指针就可以把栈中的内容销毁.这样最快
- 如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉
- C++类对象创建过程(分配空间、赋值和初始化、对象初始化顺序、虚函数表指针)
- 用于管理new动态分配对象的智能指针
- java数组创建了指针,而没有为对象分配空间
- 对象的动态分配
- 关于一个类中使用自己(类对象或类指针)
- Effective C++ 条款17 以独立语句将newed对象置入智能指针