首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么` `std::ptr::null`不能用于未调整大小的类型?

std::ptr::null是Rust标准库中的一个函数,用于返回一个空指针。在Rust中,空指针表示一个无效的内存地址。

然而,std::ptr::null不能用于未调整大小的类型,因为未调整大小的类型在编译时无法确定其大小。未调整大小的类型是指在编译时无法确定其大小的类型,例如动态数组、trait对象等。

由于未调整大小的类型的大小在编译时是未知的,因此无法将空指针赋值给这些类型的变量。这是因为编译器无法确定要为这些类型分配多少内存空间。

如果要表示一个未初始化的未调整大小的类型,可以使用std::mem::MaybeUninit类型。std::mem::MaybeUninit是一个用于表示未初始化的内存的类型,可以在需要时进行初始化。

总结起来,std::ptr::null不能用于未调整大小的类型,因为这些类型的大小在编译时是未知的,无法确定要为其分配多少内存空间。如果需要表示未初始化的未调整大小的类型,可以使用std::mem::MaybeUninit类型。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【CC++】——小白初步了解——内存管理

特点:分配内存初始化,内容是随机。...*realloc(void ptr, size_t size): 功能:调整之前分配内存块大小。...*free(void ptr): 功能:释放之前分配内存块,使其可以重新分配。 特点:释放后,指针ptr不再指向有效内存区域,应该将ptr置为NULL以防止野指针错误。...用于分配类对象。 malloc: 仅分配内存,不调用构造函数。 返回 void* 类型指针,需要类型转换。 不能重载。 用于分配任意类型内存。 2.什么是内存泄漏?如何避免?...具有后进先出特点。 内存分配效率高,但大小有限。 堆区: 用于动态内存分配。 内存由程序员手动分配和释放。 大小不固定,可以动态增长或缩小。 内存分配效率较低,但灵活性高。

9910

C++奇迹之旅:C++内存管理机制初篇

sizeof: sizeof 是一个操作符,用于获取变量或数据类型大小(以字节为单位),它在编译时就确定了返回值,不需要在运行时计算,对于数组,sizeof 返回整个数组大小,而不是单个元素大小,...(不包括结尾 '\0' 字符),它在运行时计算字符串长度,需要遍历整个字符串,对于数组,strlen 只能用于字符数组(字符串),不能用于其他类型数组,对于指针,strlen 可以计算指针所指向字符串长度...(void* ptr, size_t size); 功能:调整已分配内存块大小,并返回指向新内存块指针。...如果新大小小于原大小,则保留原有数据;如果新大小大于原大小,则原有数据会被保留,新增部分为初始化。 如果ptrNULL,则等同于malloc(size)。...,又进行初始化 #include using namespace std; int main() { // 动态申请一个int类型空间并初始化为10 int* ptr3 =

10910

Unsafe 随堂小测题解(一)

该函数一般被用于 FFi 中将一个来自于 C 数据切片转为 Rust 切片类型。所以安全性要非常注意。...因此就存在一种可能性,传入&T中会包含用于对齐初始化 padding 字节,在进行cast转换以后,data指针 也许正好会指向哪些padding字节,这个时候就是 UB。...或者传入 &MaybeUninit 也可能是初始化。即,违反上面第二条。 显然,因为指针类型转换,本来应该合法处理内存也发生了改变。第三条也违反了。...因为 ()是零大小类型(ZST)。顾名思义,零大小类型不能被分配内存。 修复思路就是判断 T是否为零大小类型,然后根据具体情况返回合适值即可。...(10分)请写出修复方案,不能改变函数签名。(10分) use std::io; /// !!!unsound!!!

89820

千万不要错过后端【纯干货】面试知识点整理 I I

它可以打印出cache命中次数,内存引用和发生cache命中每一行 代码,每一个函数,每一个模块和整个程序摘要。 若要求更细致信息,它可以打印出每一行机器码命中次数。...shmdt 分离共享内存 shmctl 控制共享内存 c++ STL内存优化 c++11新特性: 关键字和语法 auto关键字 编译器可以根据初始化来推导数据类型不能用于函数传参和以及数组类型推导...原子操作 用于多线程互斥 其他 lamda表达式 可以通过捕获列表访问上下文数据 std::function std::bin d封装可执行对象 防止头文件重复引用: #ifndef 作用:相同两个文件不会被重复包含...为什么要引入内联函数(内联函数作用) 用它替代宏定义,消除宏定义缺点。 宏定义使用预处理器实现,做一些简单字符替换因此不能进行参数有效性检测。...函数作为类成员函数,可以使用类保护成员及私有成员; inline函数使用场合 使用宏定义地方都可以使用 inline 函数; 作为类成员接口函数来读写类私有成员或者保护成员; 为什么不能把所有的函数写成

78230

Chapter 4: Smart Pointers

std::unique_ptr 设置自定义析构器后, std::unique_ptr 大小不再等于原始指针大小 当自定义析构器是函数指针时, std::unique_ptr 大小从 1 个字长变为...> vpw{pw1, pw2}; 自定义析构器可以是函数指针,函数对象, lambda 表达式,但是 std::shared_ptr 大小仍然不变,为什么?...一样,而且不会影响对象引用计数,它可以解决 std::shared_ptr 不能解决问题:引用对象可能已经销毁了 std::weak_ptr 不能解引用,也不能测试是否是空,因为 std::weak_ptr...null std::shared_ptr std::shared_ptr spw2(wpw); std::weak_ptr 可以作为缓存来加速查找失效对象 例如...,仅仅申请或释放和对象大小一样内存,而实际需要是对象大小加上控制块大小内存,因此使用 std::shared_ptr 构造函数不可行,而使用 std::make_shared 函数就无法使用类自定义

1.6K20

“new出对象“原理深层解密

1.1 new创建内置类型(int等) 在创建内置类型时,new只是不需要进行强转和计算内置类型大小,看起来更加简洁,方便....ptr1; 1.2 new创建数组 new + 对象类型 + [个数] + (初始化值) new + 对象类型 + [个数] + {num1,num2,…} 需要注意是,连续多个空间须使用...<< e.what() << std::endl; } 在上述代码中,new操作符用于分配一个包含10000个整数数组。...语法和类型安全性:malloc和free是函数,new和delete是操作符 (1)malloc是C语言中函数,malloc需要指定要分配内存大小,并返回一个指向初始化内存块指针。...内存大小计算: (1)使用malloc分配内存时,需要显式指定要分配内存块大小,以字节为单位。 (2)使用new分配单个对象时,编译器会自动计算所需内存大小,以对象类型为基础。

16730

Chapter 2: auto

使用std::function声明变量对于任何函数都是固定大小空间,如果空间不足,就会在堆上申请内存来存储这个闭包。...2.当auto推导出错误类型时使用显式类型初始化方式 当表达式返回类型是代理类类型时,不能使用auto 例1: //提取出Widget对象特征,并以vector形式返回 //每一个...因为std::vector虽然持有bool,但是operator[]作用于vector时,并不会返回vector容器中元素引用([]操作返回容器内元素引用对于其他类型都适用,...为什么会存在这种类型对象呢?因为vector是通过紧凑形式来表示bool值,每一个bit代表一个bool。...例如标准库中智能指针类型也是代理类例子,它们负责对原始指针指向资源管理。 有一些代理类是对用户可见,比如std::shared_ptr,std::unique_ptr

1.1K70

零基础入门C语言超详细字符串详解

得到新串后面会自动加上NULL结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠情况. 函数返回strDestination值.   ..., cnt) 定义两组字符串比较,返回 int 类型,实现类似 memcmp 行为   length(ptr) 定义取字符串长度,实现类似 strlen 行为   copy(a_ptr, b_ptr...  二、std::string 并不是序列容器,没有 front() 和 back() 界面用于取出前端和尾端元素,使用 std::string::operator [] 并传递 streampos...std::basic_string::size_type 实际类型为 size_t,在 Visual C++ 7.1 中实现为 unsigned,std::basic_string::npos 被静态设定为...C 风格字符串指针,copy(ptr, cnt, off = 0) 则将指定大小字符串复制到特定指针。

1K20

【C语言】动态内存管理之4个内存函数`malloc`,`free`,`calloc`和`realloc`深度了解

数组在申明时候,必须指定数组⻓度,数组空间⼀旦确定了⼤⼩不能调整,如数组里arr[10]10不能随时更改。 这是内存大致分类图: 但是对于空间需求,不仅仅是上述情况。...有时候我们需要空间大小在程序运时候才能知道,那数组编译时开辟空间方式就不能满足了。接下来,我们学习怎么一步一步分配空间吧!...p = malloc(40),但是void*指针是不能++--解引用操作,可是我们在分配空间时,作为程序员,你想用什么类型,就分配什么类型就可以了。...; return 0; } 输出: realloc realloc函数用于重新分配内存块大小。...- size:要重新分配内存块大小,以字节为单位。 返回值为调整之后内存起始位置。

21210

【C++】——入门基础知识超详解

常用输入输出流对象包括: std::cin:标准输入流,用于从键盘读取输入。 std::cout:标准输出流,用于向屏幕输出信息。 std::cerr:标准错误流,用于向屏幕输出错误信息。...这些同名函数参数列表(参数个数、类型类型顺序)不同。函数重载常用于处理实现功能类似但数据类型不同问题。...NULL引用,但有NULL指针 int* ptr = nullptr; // NULL指针 // int& ref = nullptr; // 错误,没有NULL引用 sizeof引用和指针 int...a = 10; int& ref = a; int* ptr = &a; std::cout << sizeof(ref) << std::endl; // 输出变量类型大小 std::cout <...< sizeof(ptr) << std::endl; // 输出指针类型大小(4或8字节) 引用自加即引用实体增加1,指针自加即指针向后偏移一个类型大小 int a = 10; int& ref

7910

CC++语言字符串操作总结大全(超详细)

定义两组字符串比较,返回 int 类型,实现类似 memcmp 行为 length(ptr) 定义取字符串长度,实现类似 strlen 行为 copy(a_ptr, b_ptr, cnt) 定义两组字符串复制...,若输入结尾符,则返回 1,其他输入返回原值,即总是不返回 eof()   4)int_type 类型应是当前字符类型整型编码   二、std::string 并不是序列容器,没有 front() 和...back() 界面用于取出前端和尾端元素,使用 std::string::operator [] 并传递 streampos 类型取得特定元素,如 std::string::size() - 1 作为索引取得最后一个字符...std::basic_string::size_type 实际类型为 size_t,在 Visual C++ 7.1 中实现为 unsigned,std::basic_string::npos 被静态设定为...C 风格字符串指针,copy(ptr, cnt, off = 0) 则将指定大小字符串复制到特定指针。

83620

Modern c++快速浅析

b) { return a + b; }; auto用于Lambda表达式时,同样代表遵循模板类型推导原则,例如C++11中可以将其用于匿名函数参数推导 // 使用auto接住匿名函数,匿名函数使用...&,ERROR,初始化引用 decltype(std::move(name)) d3; // string&&,ERROR,初始化引用 decltype(*np) d4; // string&...enum class 普通枚举类型是不限定作用域,即在同一个namespace中,是不能出现重名,且能够被隐式转换为int等类型值 ;强枚举类型(enum class)枚举类型是唯一,但仍可以显示强转为...int,unsigned int等类型 强枚举类型默认底层是int,但是也可以自行指定 // 该枚举大小是8字节 enum class TestEnum : int64_t { }; 可以通过std:...可以看作是空类,不携带上下文信息,因此大小是1个字节 nullptr和NULL NULL是一个宏,它代表了字面值0,它类型是int #ifndef NULL #ifdef __cplusplus

15910

C语言学习系列->动态内存管理

int a=1; //申请4个字节 char c='g'; //申请1个字节 int arr[30]={0}; //申请120个字节 这些申请好了之后,空间大小就是固定不能再去做调整...long long ago 我们说过变长数组,变长数组大小可以由变量来指定,但是一旦创建好之后,依然还是不能调整大小,而且只适用于C99中。 总的来说,申请空间大小不能灵活调整。...• 返回值类型是 void* ,所以malloc函数并不知道开辟空间类型,具体在使⽤时候使⽤者⾃ ⼰来决定。...• 如果参数 ptr 指向空间不是动态开辟,那free函数⾏为是未定义。 • 如果参数 ptrNULL指针,则函数什么事都不做。...• ptr 是要调整内存地址 • size 调整之后新⼤⼩ • 返回值为调整之后内存起始位置。 • 这个函数调整原内存空间⼤⼩基础上,还会将原来内存中数据移动到 新 空间。

11110

C语言字符串操作总结大全(超详细)

得到新串后面会自动加上NULL结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠情况. 函数返回strDestination值.   ..., cnt) 定义两组字符串比较,返回 int 类型,实现类似 memcmp 行为   length(ptr) 定义取字符串长度,实现类似 strlen 行为   copy(a_ptr, b_ptr...  二、std::string 并不是序列容器,没有 front() 和 back() 界面用于取出前端和尾端元素,使用 std::string::operator [] 并传递 streampos...std::basic_string::size_type 实际类型为 size_t,在 Visual C++ 7.1 中实现为 unsigned,std::basic_string::npos 被静态设定为...C 风格字符串指针,copy(ptr, cnt, off = 0) 则将指定大小字符串复制到特定指针。

1.8K10

CC++内存管理及内存泄漏详解

代码段:存放函数体(类成员函数和全局函数)二进制代码(可执行代码/只读常量 )。 内存映射段 是高效I/O映射方式,用于装载一个共享动态内存库。...参数 size 指的是申请空间大小 calloc:函数功能是为 num 个大小为 size 元素开辟⼀块空间,并且把空间每个字节初始化为0。...realloc:realloc 函数可以对动态开辟内存大小进行调整,返回值为调整之后内存起始位置。 free:free函数用来释放动态开辟内存。...⚡new/delete操作内置类型 void Test() { // 动态申请一个int类型空间 int* ptr4 = new int; // 动态申请一个int类型空间并初始化为10 int...* ptr5 = new int(10); // 动态申请10个int类型空间 int* ptr6 = new int[3]; delete ptr4; delete ptr5; delete

9710

C语言字符串操作总结大全(超详细)

得到新串后面会自动加上NULL结束符. 与strcat函数一样, 本函数不能处理源串与目标串重叠情况. 函数返回strDestination值.   ..., cnt) 定义两组字符串比较,返回 int 类型,实现类似 memcmp 行为   length(ptr) 定义取字符串长度,实现类似 strlen 行为   copy(a_ptr, b_ptr...  二、std::string 并不是序列容器,没有 front() 和 back() 界面用于取出前端和尾端元素,使用 std::string::operator [] 并传递 streampos...std::basic_string::size_type 实际类型为 size_t,在 Visual C++ 7.1 中实现为 unsigned,std::basic_string::npos 被静态设定为...C 风格字符串指针,copy(ptr, cnt, off = 0) 则将指定大小字符串复制到特定指针。

2.6K20
领券