休息一下接着来 2021-08-30 20:19 采纳率: 0%
浏览 75

C++智能指针问题,求大家解惑

#include <iostream>
#include <memory>
int main()
{
    int *p3 = nullptr;
    int *p4 = nullptr;
    {
        std::shared_ptr<int> p1 = std::make_shared<int>(10);        // 用make_shared初始化,开辟一个空间
        std::shared_ptr<int> p2 = std::shared_ptr<int>(new int(5));    // 用new开辟一个空间存放10

        p3 = p1.get();  // 把智能指针p1中10的地址拿出来 放到一个普通的指针p3中
        p4 = p2.get();  // 把智能指针p2中5的地址拿出来 放到一个普通的指针p4中

        std::cout << *p3 << std::endl;  // 将普通指针拿出来解引用,打印为10
        std::cout << *p4 << std::endl;  // 将普通指针拿出来解引用,打印为5
    }
    std::cout << "*********"<<std::endl;
    std::cout << *p3 << std::endl;  // 离开作用域,将普通指针p3拿出来解引用,发现智能指针 p1 没有 将内存释放,打印结果仍然为10
    std::cout << *p4 << std::endl;  //  离开作用域,将普通指针p4拿出来解引用,发现智能指针 p2 已经 将内存释放 
}

上述程序输出的结果为

img

为啥用同样是智能指针。
make_shared开辟的空间离开作用域,不会被释放
用new开辟的空间,离开作用域,会被释放
有点懵逼,求解惑。

  • 写回答

2条回答 默认 最新

  • CSDN专家-Time 2021-08-31 07:19
    关注

    new开辟的空间,离开作用域根本不会被释放。

    for(int i=0;i<1000;i++)
    {
        int * p = new [1000];
    }
    

    自己看内存大小。

    评论
  • 休息一下接着来 2021-09-01 22:23
    关注

    谢谢各位,找到问题了。是g++编译器的问题,用vs2019试了一下,发现输出结果符合预期,两个都被释放了。
    img

    评论

报告相同问题?

问题事件

  • 修改了问题 8月31日
  • 创建了问题 8月30日

悬赏问题

  • ¥15 关于网上一个easyx制作的见缝插针小游戏(c++)
  • ¥15 开地址法双散列函数处理碰撞
  • ¥15 想问一下这个是什么情况 虚拟机Linux打不开了
  • ¥15 联通光猫掉注册了怎么重新注册上去
  • ¥15 关于unity开发steamvr程序遇到的问题
  • ¥60 求tc downloader的下载方式
  • ¥15 华为 快捷方式 手电筒 接口
  • ¥15 Qt6.5支不支持Android13开发啊
  • ¥20 网络只能跑一半,应该如何设置
  • ¥20 Python调用百度开发者平台人脸识别接口