c++ new的用法(C++怎么用new创建类对象)

2024-07-22 18:35:43 7

c++ new的用法(C++怎么用new创建类对象)

本文目录

C++怎么用new创建类对象

假设类名字为 T 使用语法 :T* object = new T(), 其中括号里可以填写类初始化的参数, 得到的 object 是一个T类型的指针,别忘了用delet object 释放内存。当C++程序用new 分配内存的时候,会比C的malloc 做一些额外的工作,尤其是使得类里面使用的STD标准库类型的变量的到合适的初始化。此外,如果有自己编写的内存管理器,new 还有一个变种: T* object = new (manager) T(), 如果需要, 请参考:***隐藏网址***

谁能给几个C++new的用法的例子

int *p = new int; //此时指针p指向一个int对象,该对象没有被初始化 int *p = new int(0); //指针p指向一个int对象,该对象被初始化为0int *p = new int; //指针p指向一个int型数组,该数组未被初始化int *p = new int(0); //指针p指向一个int型数组,该数组的元素都被初始化为0new就是在程序的堆区申请一个没有命名的空间,你可以把new看成是一个系统内置的函数,该函数返回一个指向没有命名的空间地址(也就是指针).另外,对于new申请的空间,程序员必须显示的删除该内存空间,用delete删除,比如这样,delete p,和delete p,前者是删除单个对象,后者是删除一个数组

c++new的用法

c++new的用法

1、new operator

这个就是平时最经常用的new,用法如下程序所示:

 1 class A

 2 {

 3 public:

 4     A(int i) :a(i){}

 5 private:

 6     int a;

 7 };

 8 

 9 int main()

10 {

11     A* example = new A(1);

12 }

new operator实际上执行了以下三个步骤:

1、调用operator new分配内存(后面要说的第二种new),如果类本身定义了operator new,那么会调用类自己的operator new,而不是全局的;

2、调用A的构造函数A::A(int);

3、返回相应的指针

2、operator new

operator new不调用构造函数,而仅仅分配内存,有两个版本,前者抛出异常,后者当失败时不抛出异常,而是直接返回:

void* operator new (std::size_t size);

void* operator new (std::size_t size, const std::nothrow_t& nothrow_value) noexcept;

可以看到,operator new的作用有点类似与C语言中的malloc,有的地方说operator new的底层实现可以是malloc。

C++中可以用set_new_handler()设置抛出bad_alloc()异常时调用的处理函数,《《Effective C++》》有几个条款很详细描述了具体做法。

 

1 class A

 2 {

 3 public:

 4     A(int i) :a(i){}

 5     void* operator new(size_t size)

 6     {

 7         cout 《《 "call A::operator new" 《《 endl;

 8         return malloc(size);

 9     }

10     void operator delete(void* p)

11     {

12         cout 《《 "call A::operator delete" 《《 endl;

13         return free(p);

14     }

15     void* operator new(size_t size, const nothrow_t& nothrow_value) noexcept

16     {

17         cout 《《 "call A::operator new (noexcept)" 《《 endl;

18         return malloc(size);

19     }

20     void operator delete(void* p, const nothrow_t& nothrow_value) noexcept

21     {

22         cout 《《 "call A::operator delete (noexcept)" 《《 endl;

23         free(p);

24     }

25 private:

26     int a;

27 };

28 

29 int main()

30 {

31     A* example1 = new A(1);

32     delete example1;

33     A* example2 = new(nothrow) A(2);

34     delete example2;

35 }

用一个小例子可以证明一下,确实调用的是自定义operator new/delete,而不是全局的。

3、placement new

placement new仅在一个已经分配好的内存指针上调用构造函数,基本形式如下:

void* operator new (std::size_t size, void* ptr) noexcept;

placement new不需要抛出异常,因为它自身不分配内存。

c++new的用法是怎么样的

new有三种使用方式:plain new,nothrow new和placement new。

1、plain new,是普通的new,其功能主要是完成对象的初始化。定义如下:

void* operator new(std::size_t) throw(std::bad_alloc);

void operator delete(void *) throw();

提示:plain new在分配失败的情况下,抛出异常std::bad_alloc而不是返回NULL,因此通过判断返回值是否为NULL是徒劳的。

2、nothrow new,是不抛出异常的运算符new的形式。nothrow new在失败时,返回NULL。定义如下:

void * operator new(std::size_t,const std::nothrow_t&) throw();

void operator delete(void*) throw();

3、placement new,即定位放置new,这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败,因为它根本不分配内存,它做的唯一一件事情就是调用对象的构造函数。定义如下:

void* operator new(size_t,void*);

void operator delete(void*,void*);

使用方式:

placement new既可以在栈(stack)上生成对象,也可以在堆(heap)上生成对象。不用担心内存分配失败,因为它根本不分配内存,它只是调用对象的构造函数。

使用placement new构造起来的对象或数组,要显式调用它们的析构函数来销毁(析构函数并不释放对象的内存),不能使用delete.这是因为placement new构造起来的对象或数组大小并不一定等于原来分配的内存大小,使用delete会造成内存泄漏或者之后释放内存时出现运行时错误。

c++中NEW运算符的用法

c++中NEW运算符使用的一般格式为new 类型[初值]。用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。

1、newint:开辟一个存放整数的存储空间,返回一个指向该存储空间的地址(即指针)。

2、newint(100):开辟一个存放整数的空间,并指定该整数的初值为100,返回一个指向该存储空间的地址。

3、newchar[10]:开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址。

5、newint[5][4]:开辟一个存放二维整型数组(大小为5*4)的空间,返回首元素的地址。

6、float*p=newfloat(3.14159):开辟一个存放单精度数的空间,并指定该实数的初值为3.14159,将返回的该空间的地址赋给指针变量p。

扩展资料:

通过NEW运算符生成对象时,缓冲区会提前分配,可以使用堆的空间,也可以使用栈的空间。一旦这个对象使用完毕,就必须显式的调用类的析构函数进行销毁对象。但此时内存空间不会被释放,以便其他的对象的构造。

因此,如果缓冲区在堆中,那么调用delete buf;进行内存的释放;如果在栈中,那么在其作用域内有效,跳出作用域,内存自动释放。

C++如何用new动态开辟一个一维字符数组

C++用new动态开辟一个一维字符数组步骤如下:

1、new 分配内存,通用格式是:类型名 * 指针 = new 类型名;如  int * pi = new int;类型可以是基本数据类型、结构体、自定义类等。

2、delete 来释放内存,通用格式是:delete 指针名;注意 delete 与 new 配对,只能释放 new 分配的内存。delete只能用一次,不能释放指针两次。

3、new 创建动态数组,通用格式是:类型名 * 指针 = new 类型名 ;pc 被赋值为第一个元素的地址,指向第一个元素。

4、delete 释放动态数组,通用格式是: delete 指针。

5、new 创建的动态数组,指针可当作数组名来使用,如 float * pf = new float ,是数组的第25个元素的值,下标从0开始。

6、new 和 delete 是C++中用来动态分配内存的,C语言使用 malloc 和 free。

c++中new是什么意思

C++中new运算符用于动态分配和撤销内存的运算符。

new运算符使用的一般格式为new 类型 。

用new分配数组空间时不能指定初值。如果由于内存不足等原因而无法正常分配空间,则new会返回一个空指针NULL,用户可以根据该指针的值判断分配空间是否成功。 

一般来说,使用new申请空间时,是从系统的“堆”(heap)中分配空间。申请所得的空间的位置时根据当时的内存的实际使用情况决定的。但是,在某些特殊情况下,可能需要在程序员指定的特定内存创建对象,这就是所谓的“定位放置new”(placement new)操作。

扩展资料:

1、用定位放置new操作,既可以在栈(stack)上生成对象,也可以在堆(heap)上生成对象。如本例就是在栈上生成一个对象。

2、使用语句A* p=new (mem) A;定位生成对象时,指针p和数组名mem指向同一片存储区。所以,与其说定位放置new操作是申请空间,还不如说是利用已经请好的空间,真正的申请空间的工作是在此之前完成的。

3、使用语句A *p=new (mem) A;定位生成对象是,会自动调用类A的构造函数,但是由于对象的空间不会自动释放(对象实际上是借用别人的空间),所以必须显示的调用类的析构函数,如本例中的p-》~A()。

4、万不得已才使用placement new,只有当你真的在意对象在内存中的特定位置时才使用它。例如,你的硬件有一个内存映像的I/O记时器设备,并且你想放置一个Clock对象在哪那个位置。

参考资料:百度百科-new

c++ new的用法(C++怎么用new创建类对象)

本文编辑:admin

本文相关文章:


c++ new的用法(c++中NEW运算符的用法)

c++ new的用法(c++中NEW运算符的用法)

本文目录c++中NEW运算符的用法谁能给几个C++new的用法的例子c++中new是什么意思C++如何用new动态开辟一个一维字符数组c++new的用法C++怎么用new创建类对象c++new的用法是怎么样的c++中NEW运算符的用法c++

2024年6月28日 08:49

c++ new的用法(c++new的用法)

c++ new的用法(c++new的用法)

本文目录c++new的用法C++如何用new动态开辟一个一维字符数组c++中NEW运算符的用法C++怎么用new创建类对象c++new的用法是怎么样的c++中new是什么意思谁能给几个C++new的用法的例子c++new的用法c++new的

2024年5月7日 19:32

更多文章:


迅雷高速通道(迅雷高速通道资源被举报进入失败的破解方法)

迅雷高速通道(迅雷高速通道资源被举报进入失败的破解方法)

这篇文章给大家聊聊关于迅雷高速通道,以及迅雷高速通道资源被举报进入失败的破解方法对应的知识点,希望对各位有所帮助,不要忘了收藏本站哦。本文目录迅雷高速通道资源被举报进入失败的破解方法迅雷高速通道是什么原理迅雷的高速通道下载是什么原理迅雷为什

2024年6月30日 03:14

ping exe(如何打开电脑ping功能)

ping exe(如何打开电脑ping功能)

本文目录如何打开电脑ping功能运行exe文件移动运行ping电脑ping怎么打开计算机ping在哪里打开进程ping.exe是怎么回事ping.exe是什么进程如何打开电脑ping功能1、打开系统的“控制面板”,选择“windows防火墙

2024年6月2日 11:36

小滴的角色经历?高中生物:培养液小滴是什么怎么形成

小滴的角色经历?高中生物:培养液小滴是什么怎么形成

本文目录小滴的角色经历高中生物:培养液小滴是什么怎么形成小滴的介绍全职猎人小滴怎么死的小滴管家如何远程控制团聚体小滴的特征常吐小滴稀薄水样痰,其它无任何症状小滴的角色经历小滴第一次见到小杰一行人,是在小杰等人举行的腕力比赛上,因为看上了奖品

2024年7月9日 09:14

三国群英传单机游戏下载(三国群英传2原版安卓单机版在哪里下载)

三国群英传单机游戏下载(三国群英传2原版安卓单机版在哪里下载)

各位老铁们,大家好,今天由我来为大家分享三国群英传单机游戏下载,以及三国群英传2原版安卓单机版在哪里下载的相关问题知识,希望对大家有所帮助。如果可以帮助到大家,还望关注收藏下本站,您的支持是我们最大的动力,谢谢大家了哈,下面我们开始吧!本文

2024年8月27日 01:35

交管12123最新版本下载(12123交罚款时显示手机版本过低)

交管12123最新版本下载(12123交罚款时显示手机版本过低)

本篇文章给大家谈谈交管12123最新版本下载,以及12123交罚款时显示手机版本过低对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录1212

2024年7月28日 20:01

为什么FC游戏普遍难度很大?如果设计一款游戏,极难积攒足够的资源以打败系统如果是你的话,会怎么玩

为什么FC游戏普遍难度很大?如果设计一款游戏,极难积攒足够的资源以打败系统如果是你的话,会怎么玩

本文目录为什么FC游戏普遍难度很大如果设计一款游戏,极难积攒足够的资源以打败系统如果是你的话,会怎么玩在《三国志9》游戏中,如何招降敌方武将哪些武将极难招揽你认为红白机时代五大高难度游戏是哪些《第二银河》这游戏难不难有什么特别难的电子游戏极

2023年8月17日 18:20

如何查公交车实时到站信息?怎么在苹果手机中查找到公交车到站时间

如何查公交车实时到站信息?怎么在苹果手机中查找到公交车到站时间

本篇文章给大家谈谈实时公交,以及如何查公交车实时到站信息对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录如何查公交车实时到站信息怎么在苹果手机中查找到公交车到站时间如何查看实时公交车辆到站时间查公交站几分钟到站你对实时公交有哪

2024年8月30日 13:50

1 76精品蓝魔(1.76蓝魔精品的大事记)

1 76精品蓝魔(1.76蓝魔精品的大事记)

本文目录1.76蓝魔精品的大事记自己架设的传奇S-F176蓝魔精品版的55级人物自己变深粉色了求大神告诉我哪个文件或设置能不变色1.76蓝魔精品的大事记2001年9月28日热血传奇正式运营,一个传奇由此开始 。2001年10月6日热血传奇在

2023年10月1日 14:40

ai志愿助手(AI志愿助手是做什么的)

ai志愿助手(AI志愿助手是做什么的)

今天给各位分享AI志愿助手是做什么的的知识,其中也会对AI志愿助手是做什么的进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录AI志愿助手是做什么的报志愿的软件a1志愿助手百分之多少可靠免费填报志愿的软件ai志愿

2024年7月1日 17:39

安卓暴力破解root(如何暴力破解root)

安卓暴力破解root(如何暴力破解root)

大家好,安卓暴力破解root相信很多的网友都不是很明白,包括如何暴力破解root也是一样,不过没有关系,接下来就来为大家分享关于安卓暴力破解root和如何暴力破解root的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!本

2024年5月14日 11:44

北京帮推客科技发展有限公司怎么样?加入爱茉尔帮推客源是真的吗

北京帮推客科技发展有限公司怎么样?加入爱茉尔帮推客源是真的吗

本文目录北京帮推客科技发展有限公司怎么样加入爱茉尔帮推客源是真的吗友帮推客怎么注册北京帮推客科技发展有限公司怎么样北京帮推客科技发展有限公司是2015-09-23在北京市朝阳区注册成立的有限责任公司(自然人投资或控股),注册地址位于北京市朝

2024年7月15日 11:47

爱思加强版苹果下载安装(苹果手机如何更新爱思加强版)

爱思加强版苹果下载安装(苹果手机如何更新爱思加强版)

大家好,今天小编来为大家解答以下的问题,关于爱思加强版苹果下载安装,苹果手机如何更新爱思加强版这个很多人还不知道,现在让我们一起来看看吧!本文目录苹果手机如何更新爱思加强版怎么在苹果手机上下载爱思助手苹果手机里的爱思加强版手机App是怎么下

2024年10月19日 20:25

学校排课系统有什么好处有哪些值得推荐的排课系统?兴文排课系统收费吗

学校排课系统有什么好处有哪些值得推荐的排课系统?兴文排课系统收费吗

大家好,关于排课系统很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于学校排课系统有什么好处有哪些值得推荐的排课系统的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助

2024年5月28日 04:33

大话水浒好玩吗(大话水浒 好玩不》)

大话水浒好玩吗(大话水浒 好玩不》)

本文目录大话水浒 好玩不》大话水浒好玩吗大话水浒ws好玩吗大话水浒好玩不大话水浒好玩吗如果是新手的话玩什么职业比较容易些大话水浒 好玩不》玩久是必定扔钱的游戏.大概50-70级就要扔1次钱吧.80-90也要.如果玩家不太黑的话是可以选择继续

2024年6月21日 14:56

filterchain(如何创建过滤器Filter)

filterchain(如何创建过滤器Filter)

本文目录如何创建过滤器Filter如何实现一个简单地Filterjava过滤器中实现Filter的类怎么写如何创建过滤器Filter建立一个过滤器涉及下列五个步骤:1、建立一个实现Filter接口的类。这个类需要三个方法,分别是:doFil

2023年8月6日 07:00

免费照片恢复软件(照片恢复软件有哪些)

免费照片恢复软件(照片恢复软件有哪些)

大家好,今天小编来为大家解答以下的问题,关于免费照片恢复软件,照片恢复软件有哪些这个很多人还不知道,现在让我们一起来看看吧!本文目录照片恢复软件有哪些有没有不收费的手机相片恢复软件有什么免费恢复照片的软件真正免费手机照片恢复软件修复照片的免

2024年10月13日 23:45

摩托车比赛有女选手吗?摩托车比赛中,选手为什么要趴伏在摩托车上

摩托车比赛有女选手吗?摩托车比赛中,选手为什么要趴伏在摩托车上

本文目录摩托车比赛有女选手吗摩托车比赛中,选手为什么要趴伏在摩托车上摩托车都有什么赛事摩托车赛级别2020珠海摩托车比赛什么时候举办摩托车比赛有女选手吗有。摩托车比赛对性别是不限制的,女性选手也可以参加。比较有名的摩托车赛事是世界摩托车锦标

2024年6月27日 21:47

饥荒中文版下载(饥荒单机版哪里下载 饥荒单机版下载方法)

饥荒中文版下载(饥荒单机版哪里下载 饥荒单机版下载方法)

本文目录饥荒单机版哪里下载 饥荒单机版下载方法饥荒中文版在哪下载饥荒低配版要怎么下载饥荒单机版哪里下载 饥荒单机版下载方法1、首先在steam商店中找到并购买Don’t starve也就是饥荒。 2、购买饥荒后,点击上方工具栏中的库,在库

2024年7月21日 18:16

腾讯实名认证中心(腾讯游戏安全中心实名认证怎么老是不通过)

腾讯实名认证中心(腾讯游戏安全中心实名认证怎么老是不通过)

本文目录腾讯游戏安全中心实名认证怎么老是不通过腾讯游戏实名认证中心出现,您提交的账号与身份信息暂不符合变更要求是什么意思怎么解决微信腾讯实名认证如何查看腾讯游戏实名认证中心出现,您提交的账号与身份信息暂不符合变更要求手机腾讯视频实名认证在哪

2024年7月2日 18:15

街机游戏rom下载网站(街机游戏ROM下载的网站)

街机游戏rom下载网站(街机游戏ROM下载的网站)

本篇文章给大家谈谈街机游戏rom下载网站,以及街机游戏ROM下载的网站对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录街机游戏ROM下载的网站街机模拟器哪里下载街机游戏在哪下载求街机游戏神剑伏魔录模拟器和ROM下载地址(包括模

2024年9月7日 11:15

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2342
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1735
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1168
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1164
标签列表

热门搜索