当前位置: 首页 > news >正文

网站开发多少钱一天是沈阳唐朝网站建设

网站开发多少钱一天是,沈阳唐朝网站建设,网站制作ppt,小红书推广平台有哪些malloc、free和new、delete的区别 //malloc和free,称作c的库函数 //new和delete,称作运算符 /**********************************************/ //malloc按照字节开辟内存,返回值是void *,需要做类型强转 //仅开辟内存,不做初始化;malloc开…

malloc、free和new、delete的区别

//malloc和free,称作c的库函数
//new和delete,称作运算符
/**********************************************/
//malloc按照字节开辟内存,返回值是void *,需要做类型强转
//仅开辟内存,不做初始化;malloc开辟内存失败,是通过返回值和nullptr比较
//new 是指定类型开辟内存,返回指定类型的类型指针;new不仅可以做内存开辟,还可以做内存初始化操作;new开辟内存失败是通过抛出bad_alloc的异常来判断的int *p=(int *)malloc(sizeof(int));
if (p==nullptr)
{return -1;
}
*p=20;//需要单独进行初始化
free(p);//等效的new和delete操作为
try
{
int *p1=new int (20);
}
catch(const bad_alloc &e)
{}
delete p1;//开辟数组类型的操作
int *q=(int *)malloc(sizeof(int)*20);
if (q==nullptr)
{return -1;
}
free(q);int *q1=new int[20];//仅负责开辟内存
int *q1=new int[20]();//这种会初始化开辟的内存为零,不能传入其他值
delete []q1;

new的种类

int *p1=new int(20);int *p2=new (nothrow) int;//不抛出异常const int *p3=new const int(40); //堆上开辟常量//定位new
int data=0;
int *p4=new (&data) int(50);//指定在data的地址,划分出内存,并可以赋值
cout<<"data:"<<data<<endl;

new/delete 与 new[]/delete[] 不可混用的深层原因

首先重载new和delete 以及new []和delete []运算符


//这里是全局运算符重载
//先开辟内存空间,再调用对象构造函数
void* operator new(size_t size)
{void* p = malloc(size);if (p == nullptr){throw bad_alloc();}cout << "operator new addr:" << p << endl;return p;
}//先析构对象,再清除内存空间
void operator delete(void* ptr)
{free(ptr);cout << "operator delete addr:" << ptr << endl;
}/*构造数组类型*/
void* operator new[](size_t size)
{void* p = malloc(size);if (p == nullptr){throw bad_alloc();}cout << "operator new[] addr:" << p << endl;return p;
}void operator delete[](void* ptr)
{cout << "operator delete addr:" << ptr << endl;free(ptr);
}

情况1

随后自定义一个Test类,用以分析new和delete。

//自定义的Test类,
class Test
{
public:Test()  { cout << "Test" << endl; }~Test() {  cout << "~Test" << endl; }
private :int x;
};
int main()
{	Test* p = new Test[5];cout << "Test类的大小:" << sizeof(Test) << endl;cout << "首个对象的地址:" << p << endl;delete[]p;
}

在这里插入图片描述
根据实验结果,可以发现开辟的内存其实地址和返回的首元素对象地址相差8个字节,这是因为当使用new[]的时候,编译器在开辟内存空间的时候会专门开辟8个字节(4或者8字节,根据编译器不同)用以存放数组的个数。所以这里开辟的内存空间应该是8+5*4=28个字节。
在这里插入图片描述
而如果在delete的时候,选择delete p,编译器认为这只是一个简单的对象,只是把数组中首元素进行了删除,而不是从p-8的位置开始释放,从而造成了内存泄露。
在这里插入图片描述

情况2

int main()
{	Test* p = new Test();delete []p;
}

创建new的时候是一个普通变量,但是在delete删除的时候告诉编译器这是一个数组。
那么编译器就会从p-8(非法内存)的位置读取虚构的数组长度值,并从p-8的位置开始释放内存。但是p-8的位置不是当前p所指向的合法空间,这是越界访问,从而出错。

小结

对于普通的编译器内置类型
new 和delete[],new[] 和delete是可以混用的。
new []和delete混用
在这里插入图片描述
new 和delete[]混用
在这里插入图片描述
**但是强烈不建议混用**!!!

对于自定义的类类型,存在析构函数,为了调用正确的析构函数,在开辟对象数组的时候,会多开辟4或8个字节,以记录对象的个数。

http://www.dtcms.com/a/432697.html

相关文章:

  • 建设银行官方网站公司wordpress签到页面
  • 教师网站建设企业实践总结微信开发者工具快捷键
  • 在哪个网做免费网站好重庆网站模板建站公司
  • ASP做购物网站视频温州网站推广外包
  • 2016wap网站开发语言相册网站建设目的
  • 网站建设wap站网站设计论文答辩问题及答案
  • 网站 繁体 jswordpress小程序怎么发布文章
  • 网站视频插件宁波seo优化项目
  • 内蒙古做网站公司五金塑胶 技术支持 东莞网站建设
  • 嘉定专业网站制作公司完成公司门户网站建设
  • 为iBizPLM构建`知识库导出`插件
  • 茌平网站建设wordpress定时发布失败处理
  • 做网站都去哪里找模板线下推广图片
  • 网站做收款要什么条件app 外包开发公司
  • 做公司网站图片算是商用吗达州设计公司
  • 网站建设原做网站网站代理赚钱吗
  • 网站网络推广方法wordpress cpu100%
  • 青岛网站建设服务公司网站上的格式用html怎么做
  • 阿里云对象存储做静态网站开发公司员工内部销售激励方案
  • 怎样做网站设计要交税吗济南软件开发外包公司
  • 怎么把网站上传到域名网站建设营业执照如何写
  • 做视频网站犯法吗wordpress怎么安装拖拽编辑软件
  • 如何免费让网站上线网站排名优化软件联系方式
  • BUUCTF [HarekazeCTF2019]baby_rop wp
  • Nestjs框架: 菜单Menu接口功能的开发和设计
  • 做网站放广告邢台市疾控中心
  • 速通ACM省铜第十九天 赋源码(SUMdamental Decomposition)
  • C语言字符函数和字符串函数+内存操作函数
  • 容桂营销网站建设如何做公司简介介绍
  • html5建设摄影网站意义网站建设如何推广