C++中new的三种使用方法说明

本文介绍了C++中new的三种形式:普通new、nothrow new和placement new。普通new在内存分配失败时抛出std::bad_alloc异常;nothrow new在失败时返回NULL;placement new用于在已分配的内存上构造对象,不负责内存分配,需手动调用析构函数进行销毁。placement new的主要应用场景是重复利用已分配的内存,避免多次分配的开销和风险。
摘要由CSDN通过智能技术生成

一、概念

在C++中new的三种用法包括:plain new, nothrow new 和 placement new。

plain new 就是我们最常使用的new的方式,在C++中的定义如下:

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

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

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

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

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

1 void* operator new(size_t, void*);
2 void operator delete(void*, void*);

palcement new 的主要用途就是反复使用一

C++,接口通常使用抽象类来定义。抽象类是一种不能实例化的类,其目的是为了让其他类去继承它并实现其纯虚函数。接口的定义和使用方法如下: 1. 定义接口抽象类 ```c++ class Interface { public: virtual void foo() = 0; // 纯虚函数,相当于接口方法 virtual int bar(int x, int y) = 0; // 另一个接口方法 virtual ~Interface() {} // 虚析构函数,确保子类正确释放内存 }; ``` 在该抽象类,定义了两个纯虚函数,相当于接口方法。纯虚函数没有实现体,必须在子类实现。同时,为了确保子类正确释放内存,接口通常定义一个虚析构函数。 2. 定义实现类 ```c++ class MyClass : public Interface { public: void foo() override { // 实现 foo 方法 } int bar(int x, int y) override { // 实现 bar 方法 return x + y; } }; ``` 可以看到,实现类 `MyClass` 继承了接口抽象类 `Interface`,并实现了其的两个纯虚函数。这样,`MyClass` 类就成为了 `Interface` 接口的实现类。 3. 使用接口 ```c++ Interface *ptr = new MyClass(); // 创建实现类对象 ptr->foo(); // 调用接口方法 int result = ptr->bar(1, 2); delete ptr; // 释放内存 ``` 可以看到,使用接口时,先创建一个指向 `Interface` 类型的指针,指向一个 `MyClass` 对象。然后,可以通过该指针调用 `Interface` 接口定义的方法。 需要注意的是,接口方法都是纯虚函数,必须在子类实现。同时,为了确保子类正确释放内存,接口通常定义一个虚析构函数。在使用接口时,可以通过指向 `Interface` 类型的指针来操作实现类的对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值