(1)new有三种使用方式:plain new、nothrow new、placement new.
1.plain new/delete.普通的new,定义如下:
void *operator new(std::size_t) throw(std::bad_alloc);
void operator delete(void*) throw();
注:标准C++ plain new失败后抛出标准异常std::bad_alloc而非返回NULL,因此检查返回值是否为NULL判断分配是否成功是徒劳的。
测试程序:
#include "stdafx.h"
#include <iostream>
using namespace std;
char *GetMemory(unsigned long size)
{
char *p=new char[size];//分配失败,不是返回NULL
return p;
}
int main()
{
try
{
char *p=GetMemory(10e11);// 分配失败抛出异常std::bad_alloc
//...........
if(!p)//徒劳
cout<<"failure"<<endl;
delete [] p;
}
catch(const std::bad_alloc &ex)
{
cout<<ex.what()<<endl;
}
return 0;
}
2.nothrow new/delete不抛出异常的运算符new的形式,new失败时返回NULL。
定义如下:
void *operator new(std::size_t,const std::nothrow_t&) throw();
void operator delete(void*) throw();
struct nothrow_t{}; const nothrow_t nothrow;//nothrow作为new的标志性哑元
测试程序:
#include "stdafx.h"
#include <iostream>
#include <new>
using namespace std;
char *GetMemory(unsigned long size)
{
char *p=new(nothrow) char[size];//分配失败,是返回NULL
if(NULL==p)
cout<<"alloc failure!"<<endl;
return p;
}
int main()
{
try
{
char *p=GetMemory(10e11);
//...........
if(p==NULL)
cout<<"failure"<<endl;
delete [] p;
}
catch(const std::bad_alloc &ex)
{
cout<<ex.what()<<endl;
}
return 0;
}
3.placement new/delete 主要用途是:反复使用一块较大的动态分配成功的内存来构造不同类型的对象或者它们的数组。例如可以先申请一个足够大的字符数组,然后当需要时在它上面构造不同类型的对象或数组。placement new不用担心内存分配失败,因为它根本不分配内存,它只是调用对象的构造函数。
测试程序:
#include "stdafx.h"
#include <iostream>
#include <new>
using namespace std;
class ADT
{
int i;
int j;
public:
ADT()
{
}
~ADT()
{
}
};
int main()
{
char *p=new(nothrow) char[sizeof(ADT)+2];
if(p==NULL)
cout<<"failure"<<endl;
ADT *q=new(p) ADT; //placement new:不必担心失败
// delete q;//错误!不能在此处调用delete q;
q->ADT::~ADT();//显示调用析构函数
delete []p;
return 0;
}
注:使用placement new构造起来的对象或数组,要显式调用它们的析构函数来销毁(析构函数并不释放对象的内存),千万不要使用delete.这是因为placement new构造起来的对象或数组大小并不一定等于原来分配的内存大小,使用delete会造成内存泄漏或者之后释放内存时出现运行时错误。
相关推荐
以下是`new`的三种主要用法的详细解析: 1. **Plain new**: 这是最常见的`new`使用方式,它负责分配内存并调用构造函数来初始化对象。如果分配失败,`plain new`会抛出一个`std::bad_alloc`异常。例如: ```cpp ...
C++ 中关于 new 的使用方法详解 C++ 程序设计语言中,new 是一个非常重要的操作符,用于在堆上动态分配内存和创建对象。然而,许多程序员对 new 的理解仅限于其基本用法,而忽视了其其他两个重要的使用方法。本文将...
C++学习笔记:关于C++类与动态内存分配中布局new操作符 在C++中,new操作符是一种动态内存分配方式,用于在堆上分配内存以存储对象。但是,在某些情况下,我们需要使用布局new操作符来分配内存,例如在现有的内存块...
本文详细介绍了 C++ 中的 new,包括 new operator、operator new、placement new 三种形态的内容,并且详细解释了每一种形态的行为和用法,同时也提到了 delete 的相关知识点,希望对读者有所帮助。
在C++编程语言中,`new`关键字有三种主要的使用方法,这些方法可以被归类为两大类:new表达式和new操作符。每种用法都有其特定的用途和场景,对于理解和掌握C++内存管理至关重要。 首先,我们来看最常用的**new...
5. **构造和析构**:当使用`new[]`分配对象数组时,每个对象都会调用构造函数;释放时,`delete[]`会调用每个对象的析构函数,确保正确清理资源。 总之,`new`和`delete`适用于单个对象,而`new[]`和`delete[]`适用...
在C++中,动态内存分配主要通过new和delete运算符实现,而C语言中主要使用malloc和free函数。尽管这两组工具看似执行相似的功能,但它们之间存在着本质的差异。 相同点 new和malloc都可以用来在堆上分配内存,且都...
有关于c++方面new和delete的用法及关注
- **范围循环**:提供了一种更简洁的方式遍历容器。 - **lambda表达式**:使函数式编程变得更加方便。 - **线程支持**:增加了多线程编程的支持,包括std::thread和其他线程安全的工具。 3. **标准模板库(STL)**...
C++ new 运算符的含义可以分为三种:new 运算符、new 函数和 placement new。每种含义都有其特点和用法。 new 运算符 new 运算符是 C++ 中最常用的 new,它作为运算符,用于在堆上分配一块内存,并自动调用类的...
这个“课程实例 c++ new”很可能包含了一系列关于如何使用`new`来创建、管理以及理解C++中的动态内存的实例和练习。 首先,`new`操作符用于动态创建对象或数组。当你使用`new`创建一个对象时,编译器会在堆上为该...
8. **统一初始化语法**:C++11引入了一种新的初始化语法,称为统一初始化语法,它使得初始化对象的方式更加一致。这种语法不仅减少了错误,还使得代码更加易于理解。 9. **扩展的枚举类型**:C++11中的枚举类型被...
异常处理是C++中用于处理错误和异常情况的一种机制。它允许函数在遇到无法处理的错误时抛出异常,而调用者可以通过catch块来捕获并处理这些异常。了解如何正确地抛出和捕获异常,以及如何设计异常安全的代码是每个...
总的来说,C++的内存管理需要谨慎对待,尤其是new和delete的配合使用。正确地匹配new和delete的形式,以及在析构函数中正确释放指针成员所指向的内存,是防止内存泄漏和提高程序可靠性的基础。遵循这些原则,可以...
#### 七、New 表达式的三种形式 1. **单个对象的动态分配**:例如 `int *pi = new int(11);` 这里 `new int(11)` 是初始化操作,而 `new int;` 只是简单地分配内存。 2. **数组的动态分配**:例如 `int *pi = new...
new可以分为三种形态:new operator、operator new、placement new。new operator是我们平时所使用的new,其行为就是前面所说的三个步骤。operator new是可以重载的,用于分配内存的操作符。placement new是用来实现...
- **标题:“Overview of the New C++ (C++0x)”**:这个标题表明文档旨在介绍C++0x版本的主要更新与改进。C++0x是C++11标准在正式发布前的一个代号,代表了C++语言自C++98以来最重要的更新之一。 #### 描述解析 - ...
NEwmat is a famous matrix library in c++. IT'S easy to understand and to use. Note: if you watta use a particular function from the library in your project just follow the testfiles style to include ...
对于多维数组,C++提供了一种类似于声明多维数组的方式来动态创建。比如,创建一个3x4的二维整型数组可以这样写: ```cpp int** arr = new int*[3]; for (int i = 0; i ; ++i) { arr[i] = new int[4]; } ``` 这里...