【第22期】观点:IT 行业加班,到底有没有价值?

记录一个析构顺序错误导致程序中断的问题

原创 2017年01月03日 17:15:42

记录一个析构顺序错误导致程序中断的问题

在vs2013中运行以下代码(需要引入boost库),当程序结束时会出现中断。将Init()函数中的service变量声明移到main()中sockPtr声明之前,可以绕过该问题,但是这个中断究竟是如何出现的?

#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>

using namespace std;
using namespace boost::asio;

class Socket
{
public:
    void Init()
    {
        static io_service service;
        mSocketPtr.reset(new ip::tcp::socket(service));
    }

private:
    boost::shared_ptr<ip::tcp::socket> mSocketPtr;
};

int main()
{
    static boost::shared_ptr<Socket> sockPtr;
    sockPtr.reset(new Socket());
    sockPtr->Init();
}

该问题的简化版就像这样:

#include <boost/asio.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>

using namespace std;
using namespace boost::asio;

class Socket
{
public:
    void Init(io_service &ioservice)
    {
        mSocketPtr.reset(new ip::tcp::socket(ioservice));
    }

private:
    boost::shared_ptr<ip::tcp::socket> mSocketPtr;
};

int main()
{
    boost::shared_ptr<Socket> sockPtr;

    {
        sockPtr.reset(new Socket());
        io_service service;
        sockPtr->Init(service);
    }

    sockPtr.reset();  // An error will occur.
}

这里写图片描述

这里写图片描述

这里写图片描述

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

学习笔记问题大全【整理】1 C++

_______________ _______________ 整理笔记: 关于C++语言概述 如基本符号、词汇、基本框架 问: 面向对象的程序设计思想是什么? 答:面向对象的程序设计思...

2011版C++面试宝典!(值得收藏)

1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

转]C,C++经典问题,及面试笔试题

转]C,C++经典问题,及面试笔试题 1       编程基础 1.1    基本概念 1.  的理解:const char*, char const*, char*const的区别问题几乎是C++...

[zz]C++面试宝典

http://blog.csdn.net/jingxuewang110/article/details/6789557 1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C+...

LINUX编译错误总结

1.make[1]: *** No rule to make target `confparser', needed by `spider'.  Stop. 原因是文件名中有空格
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)