浅谈new与delete(2)

上一节介绍了new运算符的常规用法,这一节我们一起来看看定位new运算符的用法。

1、定位new运算符是在已分配的内存空间进行二次分配。例如:

char *buffer = new char[512];

Point *p = new (buffer) Point(); //Point为类名

Point *q = new (buffer + sizeof(Point)) Point();

即:在内存缓冲区buffe中创建对象p、q

2、delete与常规new运算符配合使用,但不能与定位new运算符使用,只能使用定位new运算符创建的对象调用析构函数,例如:

p->~Point();

3、对于使用定位new运算符创建的对象,应与创建顺序相反的顺序进行删除,因为晚创建的对象可能依赖于早创建的对象。仅当所有对象被销毁之后,才能释放用于存储这些对象的缓冲区

接下来我们来看一具体例子(参照c++ primer plus):

-------------------------------------------------------------

#include<iostream>

#include<string>

#include<new>

using namespace std;

const int BUF = 512;

class Test

{

private:

string words;

int number;

public:

Test(const string & s = "Test", int n = 0)

{

words =s;

number = n;

cout << words << " constructed\n";

}

~Test()

{

cout << words << " destroyed\n";

}

void Show()

{

cout << words << ", " << number << endl;

}

};

int main()

{

char * buffer = new char [BUF];

Test *p1, *p2;

p1 = new (buffer) Test;

p2 = new Test("heap1", 20);

cout << "memory block addresses:\n"

<< "buffer: "

<< (void*) buffer

<< "    heap: "

<< p2

<<endl;

cout << "memory contents:\n";

cout << p1 << ": ";

p1->Show();

cout << p2 << ": ";

p2->Show();

Test *p3, *p4;

p3 = new (buffer + sizeof(Test)) Test("place object in buffer", 6);

p4 = new Test("heap2", 10);

cout << "memory contents:\n";

cout << p3 << ": ";

p3->Show();

cout << p4 << ": ";

p4->Show();

delete p2;

delete p4;

p3->~Test();

p1->~Test();

delete [] buffer;

cout << "Done\n";

return 0;

}

-------------------------------------------------------------

程序运行结果如下:

我们注意到:

程序在已创建的内存缓冲区中,再次创建两个Test对象。并且在最后程序显式地为使用定位new运算符创建的对象P1、P3调用了构析函数。而且删除顺序是按照与创建顺序相反的顺序进行删除,因为较晚创建的对象可能依赖较早创建的对象。最后,缓存区的释放,必须在P1、P3都被销毁之后进行。

还有一点就是在缓存区创建P1、P3时,要提供两个位于缓冲区里面的不同地址,避免两个内存单元重叠。程序中指定了P3相对于P1的偏移量为Test对象的大小。

时间: 2024-11-05 18:45:24

浅谈new与delete(2)的相关文章

浅谈new与delete(1)

new运算符的作用是完成动态内存分配和初始化工作. 对应的,delete运算符的作用就是完成清理与释放内存工作. 在类构造函数中,可以使用new为数据分配内存,并将内存地址赋予类成员.这样一来,类就可以处理长度不同的字符串,而不用在类设计时就提前固定数组的长度. 但是,如果对象包含成员指针,同时它指向的内存是由new分配的,则当释放用于保存对象的内存时并不会自动释放该对象成员指针指向的内存.因此,当在类构造函数中使用new类来分配内存时,就应该在类析构函数中使用delete来释放分配的内存.如此

浅谈new、delete和malloc、free的用法与区别

(1)new和delete用法 如下几行代码: int *pi=new int; int *pi=new int(); int *pi=new int(1024); 第一行这个new表达式在自由存储区中分配创建了一个整形对象,并返回一个指向该对象的地址来初始化指针pi.第二行同一行,只是对指针pi指向的地址的值进行了初始化为0.第三行初始化为1024. 当动态创建的对象用完后必须释放内存,避免造成内存泄漏,可以用delete来完成,new和delete是成对使用的,如下命令释放pi指向的int型

浅谈RAII&智能指针

关于RAII,官方给出的解释是这样的"资源获取就是初始化".听起来貌似不是很懂的哈,其实说的通俗点的话就是它是一种管理资源,避免内存泄漏的一种方法.它可以保证在各种情况下,当你对对象进行使用时先通过构造函数来进行资源的分配和初始化,最后通过析构函数来进行清理,有效的保证了资源的正确分配和释放.(特别是在异常中,因为异常往往会改变代码正确的执行顺序,这就很容易引起资源管理的混乱和内存的泄漏) 其中智能指针就是RAII的一种实现模式,所谓的智能就是它可以自动化的来管理它所指向那份空间的资源

浅谈移动前端的最佳实践(转)

前言 这几天,第三轮全站优化结束,测试项目在2G首屏载入速度取得了一些优化成绩,对比下来有10s左右的差距: 这次优化工作结束后,已经是第三次大规模折腾公司框架了,这里将一些自己知道的移动端的建议提出来分享下,希望对各位有用 文中有误请您提出,以免误人自误 技术选型 单页or多页 spa(single page application)也就是我们常常说的web应用程序webapp,被认为是业内的发展趋势,主要有两个优点: ① 用户体验好 ② 可以更好的降低服务器压力 但是单页有几个致命的缺点:

C语言中的位拷贝与值拷贝浅谈(转载)

注:C语言实现的PHP变量的赋值过程中,就涉及到了 深拷贝和浅拷贝 位拷贝拷贝的是地址(也叫浅拷贝),而值拷贝则拷贝的是内容(深拷贝).深拷贝和浅拷贝可以简单理解为:如果一个类拥有资源,当这个类的对象发生复制过程的时候,资源重新分配,这个过程就是深拷贝,反之,没有重新分配资源,就是浅拷贝. 位拷贝,及"bitwise assignment"是指将一个对象的内存映像按位原封不动的复制给另一个对象,所谓值拷贝就是指,将原对象的值复制一份给新对象. 在用"bitwise assig

io流浅谈

IO流浅谈 在这篇文章里,我会分别和大家聊字节流和字符流 一字节流 File     File:文件和目录(文件夹)路径名的抽象表示形式.       File的构造方法:    File(String pathname):把一个路径名称封装成File对象    File(String parent, String child):把一个父路径和一个子路径封装成一个File对象    File(File parent, String child):把一个父路径File对象和一个子路径封装成一个Fi

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析,左值与右值

C++:浅谈c++资源管理以及对[STL]智能指针auto_ptr源码分析 by 小威威 1. 知识引入 在C++编程中,动态分配的内存在使用完毕之后一般都要delete(释放),否则就会造成内存泄漏,导致不必要的后果.虽然大多数初学者都会有这样的意识,但是有些却不以为意.我曾问我的同学关于动态内存的分配与释放,他的回答是:"只要保证new和delete成对出现就行了.如果在构造函数中new(动态分配内存),那么在析构函数中delete(释放)就可以避免内存泄漏了!" 事实果真如此么?

浅谈 举家搬迁静态文件到CDN

由于七牛CDN最近做活动,对于标准用户可以免费使用如下优惠 10 GB 存储空间 10 G/月 下载流量 10 万次/月 PUT/DELETE 请求 100 万次/月 GET 请求 以上这些指标直接就说明了,对于很多小型网站基本就够了.所以我就把我的网站的一些静态文件和图片都转移到CDN中去 前面我写过一篇文章 :[逗比作孽呀]网站缓存优化   就是为了加快图片的访问速度,这次把图片都放到CDN去,这样就会更快了 但是对于我来讲,我还要考虑一个问题,那就是如果七牛CDN出问题了,我如何快速的切换

浅谈php web安全

首先,笔记不是web安全的专家,所以这不是web安全方面专家级文章,而是学习笔记.细心总结文章,里面有些是我们phper不易发现或者说不重视的东西.所以笔者写下来方便以后查阅.在大公司肯定有专门的web安全测试员,安全方面不是phper考虑的范围.但是作为一个phper对于安全知识是:“知道有这么一回事,编程时自然有所注意”. 概要: 1.php一些安全配置 (1)关闭php提示错误功能 (2)关闭一些“坏功能” (3)严格配置文件权限. 2.严格的数据验证,你的用户不全是“好”人 2.1为了确