子嘉的博客 子嘉的博客
首页
bic-bic
技术
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

高子嘉

没有比脚更长的路,没有比人更高的山
首页
bic-bic
技术
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • new
  • vector_init
  • vector_traverse
  • macro_magic
  • io
  • gdb
  • cplusplus
子嘉
2022-06-05

new

在 C++中 new 在申请内存失败时默认会抛出一个 std::bad_alloc 异常。

所以,按照 C++标准,如果想检查 new 是否成功,则应该通过 try catch 捕捉异常。

但有些编译器不支持 try catch。

用户一般简单地使用”new(std::nothrow) 类型”。

new 在分配内存失败时会抛出异常, 而”new(std::nothrow)”在分配内存失败时会返回一个空指针

对已存在的指针,通过 new 调用类构造函数

#include <iostream>
#include <cstdlib>

class C{
    public:
        C(int _x):x(_x){}
        int x;
};

int main(void)
{
    C* ptr =(C*)malloc(sizeof(C));
    (void)new(ptr) C(4);
    cout<<ptr->x<<endl;
    return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

定位 new 表达式 语法如下

new (place_address) type
new (place_address) type(initializers)
new (place_address) type [size]
new (place_address) type [size]{braced initializer list}
1
2
3
4

该用法不分配任何内存,它只是简单地返回指针实参,然后有 new 表达式负责在指定的地址初始化对象以完成整个工作。即定位 new 允许我们再一个特定的、预先分配的地址上构造对象。 用法示例

char buff[100];
int *p;
p = new(buff) int[20]; //p指向一个长度为20的int数组

char buff1[4];
int *p1=new(buff1)int
int *p2=new(buff1)int(0) //以上两种调用都可以
1
2
3
4
5
6
7
编辑 (opens new window)
上次更新: 2023/02/24, 10:34:03
vector_init

vector_init→

最近更新
01
mongodb restore
03-06
02
pytesseract
02-28
03
consul
02-24
更多文章>
Theme by Vdoing | Copyright © 2022-2025 子嘉 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式