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

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-05-20

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构造起来的对象或数组大小并不一定等于原来分配的内存大小。

本回答被网友采纳
第2个回答  2021-05-20

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

本回答被网友采纳