场景

  1. Rust里不会出现野指针的情况,那么在C++里能避免吗?

说明

  1. 野指针是指指向无效内存地址的指针,访问它会导致未定义行为,可能引发程序崩溃、数据损坏或安全漏洞。它是 C/C++ 等手动内存管理语言中的常见错误,而 Rust 通过编译期检查几乎彻底消除了这一问题。

  2. 很遗憾,在C++里类成员指针变量是不会自动初始化的,它的指针地址是随机的,可能为0,可能为无效值。 而全部变量,C++都会默认初始化,局部变量没初始化就调用的话就会出现编译警告。没搞懂C++标准为什么单单留着类成员变量不自动初始化的的问题。

  3. C++11开始,可以使用新语法给成员变量在声明的时候直接赋值初始化。 这是开发自己手动做的工作,编译器不会代办。这种新语法还是减少了很多野指针的问题,比构造函数初始化列表方便多了。

class A
{
public:void* handle_ = NULL;int percent_ = 0;int64_t size_ = 0;
};
  1. C结构体,扁平数据结构可以用{0}赋值初始化。

  2. 总结下,C++的变量初始化规则:

  • 全局变量,在头文件里声明的或者在.cpp文件里声明的都会被编译器初始化,原始类型是0,指针类型是NULL

  • 类成员变量,静态和非静态的成员都不会被编译器初始化。非静态成员可以在声明时就手动赋值初始化,而静态非const成员必须在类外定义再次赋值初始化。

  • 局部非静态变量未初始化不能使用,会有编译警告。

  • 局部静态变量会被编译器自动初始化。

  • 非指针类对象不需要赋值初始化,因为它会调用构造函数自动初始化。如果是类成员变量,那么在创建类实例的时候会自动初始化。如果是局部变量,那么也会在声明时自动调用构造函数初始化。

例子

test-variable-init.cpp

#include <iostream>#include <memory>
#include <string>
#include <vector>
#include <stdint.h>
#include <assert.h>
#include "test-variable-init.h"using namespace std;class A;// 在头文件里声明了的全局变量,默认初始化.普通类型是0,指针类型是NULL;
int gLang;void* gWin;// 只在.cpp里声明的变量,默认初始化.普通类型是0,指针类型是NULL;int gAdd;static long gCount;A* gA;struct RGB
{int r;int g;int b;
};class A
{
public:void* handle_ = NULL;int percent_ = 0;int64_t size_ = 0;RGB rgb_ = {0};string str_;// 没有初始化string *str2_;private:static const bool bOk_ = false; // 可以直接赋值初始化static string *str3_; // 类静态成员非const,不能直接赋值初始化。
};string* A::str3_ = nullptr;#define NATIVE_FREE(a,name) shared_ptr<void> a##name(a,[](void* data){ free(data); cout << "call free" << endl; })void TestVariableInit()
{assert(gLang == 0);assert(gWin == NULL);assert(gAdd == 0);assert(gCount == 0);assert(gA == NULL);// 方法的static变量,默认初始化.static int bRun;assert(bRun == 0);// 方法的非static变量,UB(未定义行为),需要手动初始化。int fNumber = 0;  // 如果不手动初始化,编译错误,使用了未初始化的局部变量。cout << "fNumber: " << fNumber << endl;int* fDay = NULL; // 如果不初始化,编译错误,使用了未初始化的局部变量。//*fDay = 10; //RGB rgb2; // 如果不初始化,编译错误,使用了未初始化的局部变量。//cout << "rgb2 r: " << rgb2.r << " g: " << rgb2.g << " b: " << rgb2.b << endl;RGB rgb = {0};cout << "rgb r: " << rgb.r << " g: " << rgb.g << " b: " << rgb.b << endl;// RGB *pRgb; // `pRgb` 如果不初始化,编译错误,使用了未初始化的局部变量。RGB* pRgb = (RGB*)malloc(sizeof(RGB));memset(pRgb, 0, sizeof(RGB));cout << "pRgb: " << pRgb->r << endl;NATIVE_FREE(pRgb, pRgb);A a;cout << "a.size: " << a.size_ << endl;cout << "a.rgb r: " << a.rgb_.r << endl;// 未初始化,也不会编译报错。cout << "str2_ address: " << (int)a.str2_ << endl;
}int main()
{// 全部变量和静态变量都存储在全局的静态储存区。std::cout << "Hello World!\n";cout << "================ TestVariableInit ==============" << endl;TestVariableInit();
}

test-variable-init.h

#pragma onceextern int gLang;extern void* gWin;

输出

Hello World!
================ TestVariableInit ==============
fNumber: 0
rgb r: 0 g: 0 b: 0
pRgb: 0
a.size: 0
a.rgb r: 0
str2_ address: 0
call free

参考

  1. 如何避免出现悬垂指针

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915377.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915377.shtml
英文地址,请注明出处:http://en.pswp.cn/news/915377.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习基础:从数据到智能的入门指南

一、何谓机器学习​ 在我们的日常生活中&#xff0c;机器学习的身影无处不在。当你打开购物软件&#xff0c;它总能精准推荐你可能喜欢的商品&#xff1b;当你解锁手机&#xff0c;人脸识别瞬间完成&#xff1b;当你使用语音助手&#xff0c;它能准确理解你的指令。这些背后&a…

steam游戏搬砖项目超完整版实操分享

大家好&#xff0c;我是阿阳&#xff0c;今天再次最详细的给大家综合全面的分析讲解下steam搬砖&#xff0c;可以点击后面跳转往期文章了再次解下阿阳网客&#xff1a;关于steam游戏搬砖项目&#xff0c;我想说&#xff01;最早是21年5月份公开朋友圈&#xff0c;初次接触是在2…

vue2 面试题及详细答案150道(21 - 40)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

原生前端JavaScript/CSS与现代框架(Vue、React)的联系与区别(详细版)

原生前端JavaScript/CSS与现代框架&#xff08;Vue、React&#xff09;的联系与区别&#xff0c;以及运行环境和条件 目录 引言原生前端技术概述 JavaScript基础CSS基础 现代框架概述 Vue.jsReact 联系与相似性主要区别对比运行环境和条件选择建议总结 引言 在现代Web开发中&…

基于机器视觉的迈克耳孙干涉环自动计数系统设计与实现

基于机器视觉的迈克耳孙干涉环自动计数系统设计与实现 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 摘要 本文设计并实现了一种基于机器视觉的迈克耳孙干涉环自动计数系统。该系统…

设计模式笔记(1)简单工厂模式

最近在看程杰的《大话设计模式》&#xff0c;在这里做一点笔记。 书中主要有两个角色&#xff1a; 小菜&#xff1a;初学者&#xff0c;学生&#xff1b; 大鸟&#xff1a;小菜表哥&#xff0c;大佬。 也按图中的对话形式 01 简单工厂模式 要求&#xff1a;使用c、Java、C#或VB…

Vue3 学习教程,从入门到精通,Vue 3 声明式渲染语法指南(10)

Vue 3 声明式渲染语法指南 本文将详细介绍 Vue 3 中的声明式渲染语法&#xff0c;涵盖所有核心概念&#xff0c;并通过一个完整的案例代码进行演示。案例代码中包含详细注释&#xff0c;帮助初学者更好地理解每个部分的功能和用法。 目录 简介声明式渲染基础 文本插值属性绑…

React hooks——useReducer

一、简介useReducer 是 React 提供的一个高级 Hook&#xff0c;用于管理复杂的状态逻辑。它类似于 Redux 中的 reducer 模式&#xff0c;适合处理包含多个子值、依赖前一个状态或逻辑复杂的状态更新场景。与 useState 相比&#xff0c;useReducer 提供更结构化的状态管理方式。…

SEO中关于关键词分类与布局的方法有那些

前边我们说到关键词挖掘肯定很重要&#xff0c;但如何把挖掘出来的关键词用好更为重要&#xff0c;下边我们就来说说很多seo刚入行的朋友比较头疼的关键词分类问题&#xff0c;为了更直观的感受搭配了表格&#xff0c;希望可以给大家一些帮助!SEO优化之关键词分类​挖掘出的关键…

考研最高效的准备工作是什么

从性价比的角度来说&#xff0c;考研最高效的准备工作是什么呢&#xff1f; 其实就是“卷成绩”。 卷学校中各门课程的成绩&#xff0c;卷考研必考的数学、英语、政治和专业课的成绩。 因为现阶段的考研&#xff0c;最看重的仍然是你的成绩&#xff0c;特别是初试成绩。 有了…

【Linux】基于Ollama和Streamlit快速部署聊天大模型

1.环境准备 1.1 安装Streamlit 在安装Streamlit之前&#xff0c;请确保您的系统中已经正确安装了Python和pip。您可以在终端或命令行中运行以下命令来验证它们是否已安装 python --version pip --version一旦您已经准备好环境&#xff0c;现在可以使用pip来安装Streamlit了。…

Jetpack - ViewModel、LiveData、DataBinding(数据绑定、双向数据绑定)

一、ViewModel 1、基本介绍 ViewModel 属于 Android Jetpack 架构组件的一部分&#xff0c;ViewModel 被设计用来存储和管理与 UI 相关的数据&#xff0c;这些数据在配置更改&#xff08;例如&#xff0c;屏幕旋转&#xff09;时能够幸存下来&#xff0c;ViewModel 的生命周期与…

Go并发聊天室:从零构建实战

大家好&#xff0c;今天我将分享一个使用Go语言从零开始构建的控制台并发聊天室项目。这个项目虽然简单&#xff0c;但它麻雀虽小五脏俱全&#xff0c;非常适合用来学习和实践Go语言强大的并发特性&#xff0c;尤其是 goroutine 和 channel 的使用。 一、项目亮点与功能特性 …

疯狂星期四第13天运营日报

网站运营第13天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 昨日访问量 昨天大概60个ip, 同比上个星期是高点的&#xff0c;但是与星期四差别还是太大了。&#x1f602; 昨日搜索引擎收录情况 百度依旧0收录 …

吴恩达《AI for everyone》第二周课程笔记

机器学习项目工作流程以Echo/Alexa&#xff08;语音识别AI&#xff09;作为例子解释&#xff1a; 1. collect data 收集数据——人为找很多人说 Alexa&#xff0c;并录制音频&#xff1b;并且还会让一群人说其他词语&#xff0c;比如hello 2. train model 训练模型——用机器学…

uniapp props、$ref、$emit、$parent、$child、$on

1. uniapp props、ref、ref、ref、emit、parent、parent、parent、child、$on 1.1. 父组件和子组件 propsPage.vue导入props-son-view.vue组件的时候,我们就称index.vue为父组件依次类推,在vue中只要能获取到组件的实例,那么就可以调用组件的属性或是方法进行操作 1.2. pr…

4、ubuntu | dify创建知识库 | 上市公司个股研报知识库

1、创建知识库步骤 创建一个知识库并上传相关文档主要涉及以下五个关键步骤&#xff1a; 创建知识库&#xff1a;首先&#xff0c;需要创建一个新的知识库。这可以通过上传本地文件、从在线资源导入数据或者直接创建一个空的知识库来实现。 指定分段模式&#xff1a;接下来是…

Kubernetes中为Elasticsearch配置多节点共享存储

在Kubernetes中为Elasticsearch配置多节点共享存储(ReadWriteMany)需结合存储后端特性及Elasticsearch架构设计。 由于Elasticsearch默认要求每个节点独立存储数据(ReadWriteOnce),直接实现多节点共享存储需特殊处理。 ​​方案一:使用支持ReadWriteMany的存储后端(推荐…

SpringBoot热部署与配置技巧

配置文件SpringBoot 的热部署Spring为开发者提供了一个名为spring-boot-devtools的模块来使SpringBoot应用支持热部署&#xff0c;提高开发者的开发效率&#xff0c;无需手动重启SpringBoot应用相关依赖&#xff1a;<dependency> <groupId>org.springframework.boo…

Python与C#的三元运算符的写法区别

一、语法结构对比​​PyTorch示例​​dev torch.device("cuda:0" if torch.cuda.is_available() else "cpu")​​逻辑​​&#xff1a;若torch.cuda.is_available()为真&#xff0c;则返回"cuda:0"&#xff0c;否则返回"cpu"。​​作…