C++_类和动态内存分配5-使用指向对象的指针

再探new和delete

new为创建的每一个对象的名称字符串分配存储空间,这是在构造函数中进行的;

析构函数使用delete来释放这些内存。

字符串是一个字符数组,所以析构函数使用的是带中括号的delete。

 

使用new来为整个对象分配内存:

String * favorite = new String(saying[choice]);

 

这不是为要存储的字符串分配内存,而是为对象分配内存;也就是说,为保存字符串地址的str指针和len成员分配内存。

指针和对象小结

使用常规表示法来声明指向对象的指针:

String * glamour;

 

可以将指针初始化为指向已有的对象;

String * first = &saying[0];

 

可以使用new来初始化指针,这将创建一个新的对象

String * favorite = new String(sayings[choice]);

 

对类使用new将调用相应的类构造函数来初始化新创建的对象:

//调用默认构造函数

String * gleep = new String;

 

//调用 String(const char *) 构造函数

String * glop = new String(“my my my”);

 

//调用 String(const String &)构造函数

String * favorite = new String(saying[choice]);

 

可以使用->运算符通过指针访问类方法:

if (saying[i].length()< shortest ->length())

 

可以对对象指针应用解除引用运算符(*)来获得对象

if (saying[i]<*first)

       first = &saying[i];

 

12.5.3 再谈定位new运算符

定位new运算符能够让您能够在分配内存时能够指定内存位置。

 

char * buffer = new char[BUF];

JustTesting *pc1;

pc1 = new (buffer) JustTesting;  //定位new运算符

pc2 = new JustTesting(“Heap”,20);

pc3 = new (buffer +sizeof(JustTesting))JustTesting(“Better Idea”, 6);

使用定位new运算符来为对象分配内存,必须确保其析构函数被调用。如何确保呢?、对于在堆中创建的对象,可以这样做。

delete pc2;

 

但是对于pc1却不可以,原因在于delete可以与常规new运算符配合使用,却不能与定位new运算符配合使用。

Pc3没有收到new运算符返回的地址。因此delete pc3将导致运行阶段错误。

Delete pc1将释放buffer,而不是pc1;

系统没有为定位new运算符在该内存块中创建的对象调用析构函数。

对于这种情况,需要显式地为定位new运算符创建的对象调用析构函数。这是少数几个需要显式调用析构函数的情形。

 

pc3 ->~JustTesting();

pc1 ->~JustTesting();  //销毁对象的顺序,先销毁后创建的对象。类似于栈的先进后出顺序。

仅当所有对象都被销毁后,才能释放用于存储这些对象的缓冲区。

猜你喜欢

转载自www.cnblogs.com/grooovvve/p/10493521.html