C ++意外的析构函数行为

时间:2016-10-20 20:59:05

标签: c++ boost destructor

当我运行以下代码时,我看到B析构函数中的sptr指针为NULL。

#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>

using namespace std;
class B
{
public:
    ~B()
    {
        std::cout<< "B Dtor ";
        // Access sptr
    }

    void RunB()
    {
        sptr.reset(new int(2));
    }

private:
   boost::shared_ptr<int> sptr;
};

class A
{
public:
    void RunA()
    {
        b[1].RunB();
    }
private:
    B b[1];
};

int main(int argc, char *argv[])
{
    cout << "Hello World!" << endl;
    A a;
    a.RunA();
    return 0;
}

然而,当我将B b [1]更改为B b,即从数组更改为常规对象时,sptr point在B析构函数内部为NOT NULL。为什么?有人可以帮忙吗?我在这里完全无能为力。

#include <iostream>
#include <boost/shared_ptr.hpp>
#include <boost/thread/thread.hpp>
#include <boost/thread/condition_variable.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>

using namespace std;

class B
{
public:
    ~B()
    {
        std::cout<< "B Dtor ";
        // Access sptr
    }

    void RunB()
    {
        sptr.reset(new int(2));
    }

private:
   boost::shared_ptr<int> sptr;
};

class A
{
public:
    void RunA()
    {
        b.RunB();
    }
private:
    B b;
};

int main(int argc, char *argv[])
{
    cout << "Hello World!" << endl;
    A a;
    a.RunA();
    return 0;
}

1 个答案:

答案 0 :(得分:2)

在C ++中,数组的索引从0开始。因此,如果你有一个大小为1的数组,那么要访问第一个元素,你需要new this.handlerMethod而不是b[0]