休息一下接着来 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];
    }
    

    自己看内存大小。

    评论

报告相同问题?

问题事件

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

悬赏问题

  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 微信小游戏反编译后,出现找不到分包的情况
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)