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

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];
    }
    

    自己看内存大小。

    评论

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 删除虚拟显示器驱动 删除所有 Xorg 配置文件 删除显示器缓存文件 重启系统 可是依旧无法退出虚拟显示器
  • ¥15 vscode程序一直报同样的错,如何解决?
  • ¥15 关于使用unity中遇到的问题
  • ¥15 开放世界如何写线性关卡的用例(类似原神)
  • ¥15 关于并联谐振电磁感应加热
  • ¥60 请查询全国几个煤炭大省近十年的煤炭铁路及公路的货物周转量
  • ¥15 请帮我看看我这道c语言题到底漏了哪种情况吧!
  • ¥66 如何制作支付宝扫码跳转到发红包界面
  • ¥15 pnpm 下载element-plus
  • ¥15 解决编写PyDracula时遇到的问题