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

 我来答
心的舞台8888
2021-05-20 · TA获得超过12.9万个赞
知道小有建树答主
回答量:5548
采纳率:100%
帮助的人:97.4万
展开全部

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会李闭造成内存泄漏或者之后释放内存时出现运行时错误。

霂棪爱娱乐
高能答主

2021-05-20 · 用力答题,不用力生活
知道大有可为答主
回答量:6736
采纳率:99%
帮助的人:106万
展开全部

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

1、plain new是汪皮普通的new。  在C++中的用法是: void* operator new(std::size_t) throw(std::bad_alloc)。lain new在分配失败的情况下,抛出异常std::bad_alloc而不晌败是返回NULL,因此通过判断返回值是否为NULL是徒劳的。

2、nothrow new是不抛出异常的运算符new的形式。nothrow new在失败时,返回NULL。用法是:void * operator new(std::size_t,const std::nothrow_t&) throw().

3、placement new意即“放置”,这种new允许在一块已经分配成功的内存上重新构造对象或对象数组。placement new不用担心内存分配失败,因为它根本不分困谨差配内存,它做的唯一一件事情就是调用对象的构造函数。用法是:void* operator new(size_t,void*).

注意事项:

palcement new用定位放置new操作,既可以在栈(stack)上生成对象,也可以在堆(heap)上生成对象。

placement new的主要用途就是反复使用一块较大的动态分配的内存来构造不同类型的对象或者他们的数组。构造起来的对象或其数组,要显式调用它们的析构函数来销毁,这是因为placement new构造起来的对象或数组大小并不一定等于原来分配的内存大小。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
闲闲谈娱乐
高能答主

2021-05-20 · 用力答题,不用力生活
知道大有可为答主
回答量:9505
采纳率:100%
帮助的人:149万
展开全部

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会造成内存泄漏或者之后释放内存时出现运行时错误。

本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式