cp_csdn_id
2021-04-09 11:26
采纳率: 100%
浏览 90

c++ 内存重复释放

void test(int *q)
{
    std::shared_ptr<const int> ptr(q);
    std::cout << *ptr << std::endl;
}
  
int main(int argc,char *argv[])    
{  
    int *p = new int(3);
    test(p);
    delete p;
    return 0;
}

请问这样会造成内存的重复释放吗?

个人理解:智能指针ptr在函数周期结束后会被释放掉,所以会释放ptr所指向的内存,而主函数中delete会再次释放,但是这段代码能跑通,最后输出3

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

5条回答 默认 最新

  • lemon-l 2021-04-09 12:34
    已采纳

    确实有问题。test运行结束后就会释放int的内存。我机器上能输出3,但会有异常中断。

    点赞 1 打赏 评论
  • new 的对象都要手动释放吧,系统不会自动释放。

    点赞 打赏 评论
  • 猫叔压力大 2021-04-09 11:57

    函数周期结束释放的是指针占用的内存(栈),指针指向地址占用的内存(这里用的new,也就是堆)用delete释放一次。

    前后释放的不是同一个块内存,所以是没问题的。

    【望采纳】

    点赞 打赏 评论
  • Aiky哇 2021-04-09 11:57

    shared_ptr有计数器的,记录指向资源的指针数,为0才会释放资源,这个函数结束是不会释放的

    点赞 打赏 评论
  • 有问必答小助手 2021-04-09 13:35

    您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

    如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

    ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

    点赞 打赏 评论

相关推荐 更多相似问题