当前位置: 首页 > news >正文

登录怎么实现的,密码加密了嘛?使用明文还是暗文,知道怎么加密嘛?

在Java中登录功能的实现通常包括以下步骤,其中密码应该以加密形式存储在数据库中,而不以明文形式存储,以增强安全性:

登录功能的实现步骤:

  1. 用户输入: 用户在登录页面上输入用户名和密码。

  2. 传输到服务器: 用户的输入数据通过网络传输到服务器。

  3. 验证用户名: 服务器首先验证用户提供的用户名是否存在于数据库中。如果用户名不存在,登录失败。

  4. 密码验证: 如果用户名存在,服务器从数据库中检索与该用户名关联的加密密码散列值。

  5. 密码比较: 服务器将用户提供的密码通过相同的加密算法进行散列处理,然后将其与数据库中存储的散列值进行比较。如果匹配成功,登录成功;否则,登录失败。

  6. 生成会话: 一旦用户成功登录,服务器通常会生成一个会话(Session)来跟踪用户的登录状态。会话可以包括一些令牌或标识信息,以便在用户进行后续请求时进行验证。

  7. 返回响应: 服务器向客户端发送登录成功或失败的响应,并在成功登录时提供访问权限。

整理总结起来就是:

  1. 用户输入:用户在前端界面输入用户名和密码。

  2. 前端验证:前端可以进行基本的输入验证,例如检查用户名和密码是否为空。

  3. 后端验证:后端接收前端发送的用户名和密码,然后验证用户名是否存在于数据库中,并检查密码是否匹配。这通常涉及到从数据库中检索用户信息,然后使用适当的加密算法验证密码。

  4. Session管理:如果验证成功,服务器会创建一个会话(session)来表示用户已登录。这可以是基于HTTP会话的,也可以使用JWT(JSON Web Token)等其他机制。

  5. 登录状态管理:服务器通常会返回一个登录成功的响应,并在响应中包含有关用户的信息(例如用户ID或用户名)。前端可以存储这些信息,以便在用户进行后续请求时验证其身份。

密码加密:

密码通常不应该以明文形式存储在数据库中,因为这会增加安全风险。相反,应使用适当的加密算法对密码进行哈希(散列)处理,然后将哈希值存储在数据库中。这有助于保护用户密码的机密性。

以下是密码加密的一般步骤:

  1. 密码哈希:在用户注册或修改密码时,后端应使用密码哈希算法(例如BCrypt、SHA-256等)对用户提供的明文密码进行哈希处理。

  2. 哈希存储:将哈希后的密码存储在数据库中。不要存储明文密码。

  3. 验证:在用户登录时,后端会将用户提供的密码再次进行哈希处理,然后与数据库中存储的哈希密码进行比较。如果哈希值匹配,说明密码正确。

密码应该以加密形式存储在数据库中,而不以明文形式存储。这是为了防止数据库泄露或被未授权的人访问时,用户的密码不被轻易获取。常见的密码加密方法包括使用密码散列函数,如SHA-256、BCrypt  

示例代码(Spring Security中的BCrypt密码加密)

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;// 注册时加密密码
String rawPassword = "user_password";
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String encodedPassword = encoder.encode(rawPassword);
// 将encodedPassword存储到数据库中// 验证登录时比较密码
String loginPassword = "user_login_password";
if (encoder.matches(loginPassword, encodedPassword)) {// 密码匹配,允许登录
} else {// 密码不匹配,拒绝登录
}

简单举例:      

以下是一个简单的示例,包括前端和后端的代码,用于实现用户登录和密码加密的功能。前端使用HTML、CSS、JavaScript,后端使用Spring Boot和Spring Security。

前端部分(HTML + CSS + JavaScript):

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Login</title><link rel="stylesheet" type="text/css" href="styles.css">
</head>
<body><div class="login-container"><h2>Login</h2><form id="login-form"><div class="form-group"><label for="username">Username:</label><input type="text" id="username" name="username" required></div><div class="form-group"><label for="password">Password:</label><input type="password" id="password" name="password" required></div><button type="submit">Login</button></form><div id="message"></div></div><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><script src="main.js"></script>
</body>
</html>

CSS文件(styles.css):

body {font-family: Arial, sans-serif;background-color: #f4f4f4;margin: 0;padding: 0;display: flex;justify-content: center;align-items: center;height: 100vh;
}.login-container {background-color: #fff;border-radius: 5px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);padding: 20px;text-align: center;
}h2 {margin-bottom: 20px;
}.form-group {margin-bottom: 15px;text-align: left;
}label {font-weight: bold;
}input[type="text"],
input[type="password"] {width: 100%;padding: 10px;border: 1px solid #ccc;border-radius: 5px;
}button {background-color: #007bff;color: #fff;border: none;padding: 10px 20px;border-radius: 5px;cursor: pointer;
}button:hover {background-color: #0056b3;
}

JavaScript文件(main.js):

$(document).ready(function() {$('#login-form').submit(function(event) {event.preventDefault();var username = $('#username').val();var password = $('#password').val();var formData = { username: username, password: password };$.ajax({type: 'POST',url: '/login',data: JSON.stringify(formData),contentType: 'application/json',success: function(response) {$('#message').text('Login successful. Redirecting...');setTimeout(function() {window.location.href = '/dashboard';}, 1000); // Redirect to dashboard after 1 second},error: function(xhr, textStatus, errorThrown) {$('#message').text('Login failed. Please check your credentials.');}});});
});

后端部分(Spring Boot + Spring Security):

以下是Spring Boot后端的代码,包括用户实体、用户仓库、Spring Security配置、自定义用户详情服务以及密码加密配置,带有中文注释。

用户实体类(User.java):

import javax.persistence.*;@Entity
@Table(name = "users")
public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;@Column(unique = true)private String username;private String password;// 省略构造函数和其他属性的getter和setter方法// 注意:这里省略了角色相关的配置,你可以根据需要添加
}

用户仓库接口(UserRepository.java):

import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {User findByUsername(String username);
}

Spring Security配置类(SecurityConfig.java):

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Autowiredprivate CustomUserDetailsService customUserDetailsService;@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/", "/login").permitAll().antMatchers("/dashboard").authenticated().and().formLogin().loginPage("/login").defaultSuccessURL("/dashboard").and().logout().logoutSuccessUrl("/login").and().csrf().disable();}@Autowiredpublic void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(customUserDetailsService).passwordEncoder(passwordEncoder());}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

自定义用户详情服务(CustomUserDetailsService.java):

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;@Service
public class CustomUserDetailsService implements UserDetailsService {@Autowiredprivate UserRepository userRepository;@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {User user = userRepository.findByUsername(username);if (user == null) {throw new UsernameNotFoundException("用户不存在:" + username);}return new CustomUserDetails(user);}
}

密码加密配置类(PasswordConfig.java):

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
public class PasswordConfig {@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}

application.properties:

# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver# Spring Boot应用程序的端口号
server.port=8080# 数据库连接池配置(这里使用HikariCP)
spring.datasource.hikari.connectionTimeout=20000
spring.datasource.hikari.maximumPoolSize=5# 日志级别配置
logging.level.org.springframework=INFO
logging.level.com.yourpackage=DEBUG# Spring Security配置
# 禁用CSRF保护,因为我们的示例中没有CSRF令牌
security.enable-csrf=false# Spring Security登录页面配置
spring.security.form-login.login-page=/login
spring.security.form-login.default-target-url=/dashboard
spring.security.form-login.login-processing-url=/login# Spring Security注销配置
spring.security.logout.logout-success-url=/login# 数据库方言配置(根据你使用的数据库类型进行设置)
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect

用于配置应用程序的属性,包括数据库连接、服务器端口等。你可以根据你的实际需求进行修改和扩展。

将这个配置文件保存为 application.properties 并放置在你的Spring Boot项目的 src/main/resources 目录下。Spring Boot会自动加载这个配置文件并根据其中的配置信息来初始化你的应用程序。

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-springboot-app</artifactId><version>1.0.0</version><!-- 使用Spring Boot的父项目 --><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.3</version></parent><dependencies><!-- Spring Boot Web Starter,用于构建Web应用程序 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Boot Data JPA Starter,用于数据库访问 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- Spring Boot Security Starter,用于安全认证和授权 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- MySQL数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies><build><plugins><!-- Spring Boot Maven插件,用于构建可执行的JAR文件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
注意:

在Spring Boot项目的pom.xml文件中,还可能包括其他配置项,取决于项目的需求。以下是一些你会可能需要的其他配置项和依赖项:

  1. Spring Boot Starter依赖项:根据你的项目需要,你可以添加其他Spring Boot Starter依赖项,例如Spring Boot Starter Test(用于单元测试)、Spring Boot Starter Data Redis(用于Redis缓存)、Spring Boot Starter Thymeleaf(用于模板引擎)等。

  2. 自定义属性配置:你可以使用application.propertiesapplication.yml文件来配置自定义属性,例如数据库连接信息、日志配置、密钥配置等。

  3. 其他数据库驱动:如果你使用的不是MySQL,而是其他数据库,需要添加相应的数据库驱动依赖项,例如Oracle、PostgreSQL等。

  4. 前端构建工具:如果你的项目包括前端部分,可能需要配置前端构建工具(如Webpack、npm等)和相关依赖项,以构建和管理前端资源。

  5. Spring Boot插件配置:根据项目需求,你可能需要配置Spring Boot Maven插件或Gradle插件的属性,以控制构建和打包行为。

  6. Swagger文档生成:如果你想为API添加Swagger文档,可以添加Swagger相关的依赖项和配置。

  7. 数据库连接池配置:如果你使用的是数据库连接池,可以根据具体的连接池(如HikariCP、Tomcat JDBC等)进行配置。

  8. 安全证书和密钥配置:如果你的应用需要HTTPS支持,需要配置SSL证书和密钥。

  9. 日志配置:根据项目需求,你可能需要配置日志记录的级别、输出目标(文件、控制台等)等。

  10. 国际化和本地化配置:如果你的应用需要多语言支持,可以配置国际化和本地化属性。

根据具体的项目需求,可能会有其他特定的配置项和依赖项。在开发过程中,根据项目的要求逐步添加和调整这些配置。确保你的pom.xml文件和应用程序配置符合项目的需求和规范。

相关文章:

登录怎么实现的,密码加密了嘛?使用明文还是暗文,知道怎么加密嘛?

在Java中登录功能的实现通常包括以下步骤&#xff0c;其中密码应该以加密形式存储在数据库中&#xff0c;而不以明文形式存储&#xff0c;以增强安全性&#xff1a; 登录功能的实现步骤&#xff1a; 用户输入&#xff1a; 用户在登录页面上输入用户名和密码。 传输到服务器&a…...

Nginx和Tomcat负载均衡实现session共享

以前的项目使用Nginx作为反向代理实现了多个Tomcat的负载均衡&#xff0c;为了实现多个Tomcat之间的session共享&#xff0c;使用了开源的Memcached-Session-Manager框架。 此框架的优势&#xff1a; 1、支持Tomcat6和Tomcat7 2、操作粘性或不黏性Session 3、没有单点故障 4、T…...

【算法题】210. 课程表 II

题目&#xff1a; 现在你总共有 numCourses 门课需要选&#xff0c;记为 0 到 numCourses - 1。给你一个数组 prerequisites &#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示在选修课程 ai 前 必须 先选修 bi 。 例如&#xff0c;想要学习课程 0 &#xff0c;…...

“数据类型不一致”会走索引吗?

分析&回答 字符串类型的索引 id_1 varchar(20) NOT NULL这样下面两条语句的结果是一样的&#xff1a; SELECT * FROM ix_test WHERE id_11; SELECT * FROM ix_test WHERE id_11;执行计划是不同的&#xff1a; mysql> explain select * from ix_test where id_11; | 1 …...

Leetcode 1572.矩阵对角线元素之和

给你一个正方形矩阵 mat&#xff0c;请你返回矩阵对角线元素的和。 请你返回在矩阵主对角线上的元素和副对角线上且不在主对角线上元素的和。 示例 1&#xff1a; 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;25 解释&#xff1a;对角线的和为&#xff…...

[PG]将一行数据打散成多行数据

原始数据 比如有如此表结构定义: 假如查询数据如下&#xff1a; select dt as "日期",bj_count as "北京", sh_count as "上海",gz_count as "广州", sz_count as "深圳" from city_stats order by dt--------------------…...

二蛋赠书一期:《快捷学习Spring》

文章目录 前言活动规则参与方式本期赠书《快捷学习Spring》关于本书作者介绍内容简介读者对象 结语 前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c…...

Threejs汽车展厅

2023-09-06-16-29-40 预览&#xff1a;https://9kt8fy-1234.csb.app/ 源码链接...

LeetCode:207. 课程表、210. 课程表 II(拓扑排序 C++)

目录 207. 课程表 题目描述&#xff1a; 实现代码与解析&#xff1a; 拓扑排序 210. 课程表 II 题目描述&#xff1a; 实现代码与解析&#xff1a; 拓扑排序 原理思路&#xff1a; 207. 课程表 题目描述&#xff1a; 你这个学期必须选修 numCourses 门课程&#xff0…...

如何使用组件

可以复用的代码写到组件里面&#xff0c;比如左侧的导航栏 1.写好一个组件 记得结构写在template标签里面&#xff0c;当然div也可以 2.在需要使用的地方&#xff0c;用标签使用组件 3.在使用的文件内import此组件 import CommonAside from /components/CommonAside.vue; …...

Android 13.0 Launcher3定制之双层改单层(去掉抽屉式二)

1.概述 在13.0的系统产品开发中,对于在Launcher3中的抽屉模式也就是双层模式,在系统原生的Launcher3中就是双层抽屉模式的, 但是在通过抽屉上滑的模式拉出app列表页,但是在一些产品开发中,对于单层模式的Launcher3的产品模式也是常用的功能, 所以需要了解抽屉模式,然后修…...

对卷积的一点具象化理解

前言 卷积的公式一般被表示为下式&#xff1a; 对新手来说完全看不懂这是干什么&#xff0c;这个问题需要结合卷积的应用场景来说。 原理 卷积比较广泛的应用是在信号与系统中&#xff0c;所以有些公式的定义会按照信息流的习惯。假设存在一串信号g(x)经过一个响应h(x)时他的响…...

NV12数据格式转H265编码格式实现过程

一、需求 在视频处理和传输应用中&#xff0c;将视频数据编码为高效的格式是非常重要的。H.265&#xff08;也称为HEVC&#xff09;是一种先进的视频编码标准&#xff0c;具有更好的压缩性能和图像质量&#xff0c;相比于传统的编码标准&#xff08;如H.264&#xff09;&#…...

ubuntu 22.04 深度学习环境配置

第一步 安装驱动 网址&#xff1a;https://www.nvidia.com/download/index.aspx 根据硬件选择&#xff0c;我这里是 ubuntu 服务器,显卡是v100 sudo su root chmod ax NVIDIA //按 TAB 即可 加运行权限 # 禁用原显卡驱动 vim /etc/modprobe.d/blacklist.conf # 在最后一行…...

支付宝小程序集成mqtt兼容IOS和安卓

1. 前言 ​ 去年就想做支付宝小程序接入mqtt协议。但最终多方咨询&#xff0c;问客服问社区得到的答案都是支付宝小程序不能直接支持mqtt协议。偶然间发现徐宏大神的佳作&#xff0c;终于发现了xmqtt.js这个好东西。它实现了支付宝小程序完美接入mqtt协议&#xff0c;设备可以…...

在Qt5中SQLite3的使用

一、SQLite简要介绍 什么是SQLite SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 就像其他数据库&#xff0c;S…...

使用Docker部署debezium来监控 MySQL 数据库

使用Docker部署debezium来监控 MySQL 数据库 Debezium是一个分布式平台,它将来自现有数据库的信息转换为事件流,使应用程序能够检测并立即响应数据库中的行级更改。 Debezium构建在Apache Kafka之上,并提供了一组Kafka Connect兼容的连接器。每个连接器都与特定的数据库管…...

百度低质量站点怎么办?解决百度低质量站点的方法和工具

百度低质量站点怎么恢复&#xff1f;这是许多网站主和运营人员在SEO优化过程中经常面临的一个问题。百度作为中国最大的搜索引擎&#xff0c;对于网站收录和排名具有至关重要的影响。然而&#xff0c;由于各种原因&#xff0c;有些网站可能面临被百度降权或收录减少的情况。那么…...

MSOS604A是德科技keysight MSOS604A示波器

181/2461/8938Infiniium S系列示波器融合了创新技术&#xff0c;旨在提供卓越的测量。新的10位ADC和低噪声前端技术协同工作&#xff0c;提供高达8 GHz的性能和业界最佳的信号完整性。一个高级框架&#xff0c;配有可快速启动的固态硬盘、可轻松触摸的15英寸电容式显示屏和可快…...

春秋云镜 CVE-2016-0785

春秋云镜 CVE-2016-0785 S2-029 靶标介绍 2.3.28 之前的 Apache Struts 2.x 允许远程攻击者通过标签属性中的“%{}”序列执行任意代码。 启动场景 漏洞利用 工具利用 得到flag flag{a4c7fc9a-8e2d-49b8-9b09-22790fb2bfb6}...

【Oracle APEX开发小技巧12】

有如下需求&#xff1a; 有一个问题反馈页面&#xff0c;要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据&#xff0c;方便管理员及时处理反馈。 我的方法&#xff1a;直接将逻辑写在SQL中&#xff0c;这样可以直接在页面展示 完整代码&#xff1a; SELECTSF.FE…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...