自定义使用动态内存的类模板

首先清楚两点:

当类有动态分配内存的对象时,运行系统只销毁对象而不销毁内存(导致内存泄漏)---自定义析构函数

对于动态分配内存的类,初始化(复制)和赋值的默认版本不能正确管理内存 ---自定义复制函数和赋值操作符

 

考虑一个类有两个成员,几个静态分配内存的成员a,一个动态分配内存的指针成员p,p指向一个动态分配的内存,存储值b

两个类对象m,n

m=n 默认的操作是 m.a=n.a   m.p=n.p

但是由于p是一个指针,这样原先m.p的指针指向的内存将没有指针指向,同时内存依然存在,导致内存泄漏

复制也会出现类似的问题。

一般含有动态分配内存的对象的类,都有指针成员,但是复制或赋值时,默认的版本会复制指针本身,而通常不希望这样,而是复制指针指向的对象

这就需要自定义复制函数和复制操作符

 

示例代码并复习自定义类模板的内容:

 1 #include <iostream>

 2 using namespace std;

 3 

 4 template <typename T>

 5 class dynamicClass

 6 {

 7 public:

 8   dynamicClass(const T&,const T&);

 9   dynamicClass(const dynamicClass<T>&);

10   dynamicClass<T>& operator=(const dynamicClass<T>&);

11   friend ostream& operator<<(ostream &os,const dynamicClass<T> &rhs)

12   {

13     os << rhs.member1 << " " << rhs.member2 << ":" << *rhs.member2;

14     return os;

15   }

16   ~dynamicClass();

17 private:

18   T member1;

19   T *member2;

20 };

21 

22 template <typename>

23 dynamicClass<T>::dynamincClass(const T &m1,const T &m2):member1(m1)

24 {

25   member2 = new T(m2);

26 }

27 

28 template <typename T>

29 dynamicClass<T>::dynamicClass(const dynamiicClass<T> &rhs):member1(rhs.member1)

30 {

31   member2 = new T(*rhs.member2);

32 }

33 

34 template <typename T>

35 dynamicClass<T>& dynamicClass<T>::opeartor=(const dynamicClass<T> &rhs)

36 {

37   member1 = rhs.member1;

38   *member2 = *rhs.member2;

39   return *this;

40 }

41 

42 template <typename T>

43 dynamicClass<T>::~dynamincClass()

44 {

45   delete member2;

46 }

 

你可能感兴趣的:(自定义)