首页 > 其他分享 >智能指针和普通指针的区别

智能指针和普通指针的区别

时间:2024-11-29 23:33:27浏览次数:3  
标签:std 区别 int 智能 内存 shared ptr 指针

智能指针和普通指针在使用方式上有相似之处,但也存在关键的区别。以下是对比与细节解析:


1. 相似点

智能指针在行为上模拟普通指针,因此某些使用方式相同:

(1)指向对象

智能指针和普通指针都可以指向动态分配的对象:

// 普通指针
int* rawPtr = new int(10);

// 智能指针
std::shared_ptr<int> smartPtr = std::make_shared<int>(10);

(2)访问对象

两者都可以使用 * 解引用和 -> 访问成员:

struct Foo {
    int x;
    void print() { std::cout << x << std::endl; }
};

// 普通指针
Foo* rawPtr = new Foo{10};
std::cout << rawPtr->x << std::endl;  // 输出 10
rawPtr->print();  // 输出 10

// 智能指针
std::shared_ptr<Foo> smartPtr = std::make_shared<Foo>(Foo{20});
std::cout << smartPtr->x << std::endl;  // 输出 20
smartPtr->print();  // 输出 20

2. 不同点

智能指针和普通指针在内存管理操作方式使用限制上存在重要区别:

(1)内存管理

  • 普通指针

    • 需要手动管理内存,使用 new 分配后,必须手动调用 delete 释放。
    • 如果忘记释放或重复释放内存,会导致内存泄漏或程序崩溃。
    int* rawPtr = new int(10);
    delete rawPtr;  // 必须手动释放内存
    
  • 智能指针

    • 自动管理内存,当智能指针超出作用域或引用计数为 0 时,自动释放内存。
    • 减少了手动管理内存的风险。
    std::shared_ptr<int> smartPtr = std::make_shared<int>(10);
    // 不需要手动释放内存
    

(2)拷贝行为

  • 普通指针

    • 拷贝普通指针时,仅拷贝地址,不会影响指向的对象。
    • 可能导致多个指针指向同一内存区域,从而引发重复释放的问题。
    int* rawPtr1 = new int(10);
    int* rawPtr2 = rawPtr1;  // 两个指针指向同一块内存
    delete rawPtr1;
    // delete rawPtr2;  // 再次释放会导致未定义行为
    
  • 智能指针

    • 对于 std::shared_ptr,拷贝会增加引用计数,多个 shared_ptr 共享对象。
    • 对于 std::unique_ptr,不允许拷贝,只能通过移动操作转移所有权。
    // std::shared_ptr
    std::shared_ptr<int> smartPtr1 = std::make_shared<int>(10);
    std::shared_ptr<int> smartPtr2 = smartPtr1;  // 引用计数增加
    
    // std::unique_ptr
    std::unique_ptr<int> uniquePtr = std::make_unique<int>(10);
    // std::unique_ptr<int> uniquePtr2 = uniquePtr;  // 错误,不能拷贝
    std::unique_ptr<int> uniquePtr2 = std::move(uniquePtr);  // 通过移动操作
    

(3)生命周期控制

  • 普通指针

    • 生命周期由开发者手动控制,稍有不慎可能造成悬空指针或内存泄漏。
    int* rawPtr = new int(10);
    delete rawPtr;
    // rawPtr 现在是悬空指针,访问会导致未定义行为
    
  • 智能指针

    • 生命周期由智能指针自动管理,销毁时自动释放内存。
    • 多个 std::shared_ptr 可以共享同一个对象,通过引用计数控制对象的生命周期。
    std::shared_ptr<int> smartPtr1 = std::make_shared<int>(10);
    std::shared_ptr<int> smartPtr2 = smartPtr1;  // 共享管理
    smartPtr1.reset();  // 释放 smartPtr1,但对象仍由 smartPtr2 管理
    

(4)支持的操作

  • 普通指针

    • 支持基本的指针操作,如算术运算(加减偏移等)。
    • 不提供额外的内存管理功能。
    int arr[5] = {1, 2, 3, 4, 5};
    int* rawPtr = arr;
    rawPtr++;  // 指向下一个元素
    
  • 智能指针

    • 不支持指针算术操作,主要用于单一对象的管理。
    • 提供了诸如 use_count(引用计数查询)等额外功能。
    std::shared_ptr<int> smartPtr1 = std::make_shared<int>(10);
    std::cout << smartPtr1.use_count() << std::endl;  // 输出引用计数
    

总结

特性普通指针智能指针
内存管理 手动管理,容易出错 自动管理,安全性更高
拷贝行为 仅拷贝地址,可能导致问题 shared_ptr 支持拷贝,unique_ptr 仅支持移动
生命周期控制 开发者负责 智能指针自动管理
支持的操作 指针算术、地址操作等 不支持算术,提供引用计数等额外功能

结论:

  • 智能指针的使用方式与普通指针相似,但因其自动化的内存管理机制,更适合现代 C++ 编程,尤其是复杂对象的生命周期管理。
  • 普通指针灵活但容易出错,适合高性能场景或简单的栈内存管理。

标签:std,区别,int,智能,内存,shared,ptr,指针
From: https://www.cnblogs.com/chentiao/p/18577815

相关文章

  • 电子应用设计方案-28:智能云饭锅系统方案设计
    智能云饭锅系统方案设计一、系统概述本智能云饭锅系统旨在为用户提供便捷、智能、个性化的烹饪体验,通过云技术实现远程控制、食谱分享、智能烹饪等功能。二、系统组成1.饭锅主体   -内胆:采用优质不粘涂层,具有良好的导热性和耐用性。   -加热元件:IH电磁加......
  • JAVA开源毕业设计 课程智能组卷系统 Vue.JS+SpringBoot+MySQL
    本文项目编号T009,文末自助获取源码\color{red}{T009,文末自助获取源码}......
  • 双指针算法5
    原题1:给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。原题2:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。原题3:给你一个单链表的头节点 head ,请你判断该链表是否为回文......
  • 基于ssm汽车维修保养智能预约系统,附源码+数据库+论文+任务书+开题报告,包安装调试
    1、项目介绍基于ssm的汽车维修保养智能预约系统,分为用户、员工和管理员用户-功能:登录、注册、首页、公告项目、个人中心、后台管理、项目收藏、项目预约订单员工-功能:登录、首页、个人中心、公告管理、项目管理、用户管理管理员-功能:首页、个人中心、基础数据管理、公告管......
  • 内转子电机和外转子电机有什么区别?
    在现代电机技术中,内转子电机和外转子电机是两种广泛应用的电机类型。尽管两者都可以用于驱动各种机械设备,但在结构设计、工作原理以及应用场合等方面存在显著的差异。一、定义与结构1.内转子电机内转子电机是一种电机类型,其中转子位于定子的内部。该电机的转子通常由一个或......
  • VideoChat:高效学习新神器!一键解读音视频内容,结合 AI 生成总结内容、思维导图和智能问
    ❤️如果你也关注AI的发展现状,且对AI应用开发非常感兴趣,我会每日跟你分享最新的AI资讯和开源应用,也会不定期分享自己的想法和开源实例,欢迎关注我哦!......
  • C语言 - 指针,数组
    指针指针入门创建变量intage=10;创建指针,指向变量指针类型*指针变量=&变量int*p=&age;当有了指针之后,就可以通过指针操作他指向的数据了通过指针获取指向的位置的数据,在指针前面加一个*为解引用指针前加*修改,改的是指针指向的位置的值指针的作用:游......
  • 六分钟了解具身智能
    六分钟了解具身智能领域:机器人领域:具身智能是机器人发展的重要方向,旨在让机器人能够像人类一样通过身体与环境进行交互,从而更好地完成各种任务人工智能领域:具身智能推动人工智能从单纯的数据处理和分析向更加智能、自主的方向发展,使其能够更好地理解和适应现实世界.认知科......
  • 如何使用git fetch与git pull,在团队协作中二者有什么区别,具体案例分析并深入理解
    gitfetch与gitpullgitpull和gitfetch都是用于从远程仓库获取更新的命令,但它们的功能和使用场景有所不同。理解这两个命令的区别以及如何有效地在团队协作中使用它们,对于提高工作效率和减少合并冲突至关重要。gitfetch作用:gitfetch会从远程仓库下载所有新的数......
  • ToDesk云游戏和本地电脑有什么区别?云电脑优缺点分析
    当前云游戏市场需求旺盛,游戏用户对便捷高效的游戏方式有着强烈的需求,更是未来几年游戏公司的主要战场,因此ToDesk顺应这一需求,在2024年正式推出云游戏平台,一经上线就受到广大游戏用户的欢迎。很多第一次接触到云游戏的用户可能会疑惑,这跟在自己本地电脑上玩游戏有什么区别?小编今......