析构函数是否可以不调用特定字段的析构函数?

时间:2017-02-03 18:57:05

标签: c++ c++11

我正在使用带有-std=c++0x标志的C ++编译器。

我正在为类编写虚拟内存系统的模拟,并遇到了一个问题:

其中一个类VirtualMemory通过给它们一个整数和一个指向自身的指针来初始化一个名为OurPointer的不同类的几个对象。

程序运行几个指针,这些指针都链接到同一个虚拟内存。 OurPointer的构造函数如此:

OurPointer::OurPointer(int adr , VirtualMemory* vrtlMem)
{
    _adr = adr;
    _vrtlMem = vrtlMem;
}

这是因为OurPointer用于处理VirtualMemory。问题是,每次销毁OurPointer对象时,它都会调用_vrtlMem的析构函数,该析构函数指向程序仍在使用的同一VirtualMemory对象。

有没有办法从析构函数中排除该字段?我试图把它变成一个静态字段,或者更改指针,但它并没有停止析构函数。

1 个答案:

答案 0 :(得分:1)

  

问题是,每次销毁OurPointer对象时,它都会调用_vrtlMem的析构函数

只有在以下情况下才会这样:

  1. 您已经编写了一个析构函数来执行此操作,例如:

    OurPointer::~OurPointer()
    {
        delete _vrtlMem;
    }
    
  2. _vrtlMem是一个智能指针,如std::auto_ptrstd::unique_ptr,当它们自身被破坏时会破坏指向的对象。

  3.   

    指向程序仍在使用的同一个VirtualMemory对象。

    这正是C ++ 11 std::shared_ptr设计的那种情况。在完成对它的所有引用之前,不会破坏共享对象。

    由于您没有使用C ++ 11,您可以使用boost::shared_ptr代替,或者您可以手动实现引用计数。

      

    有没有办法从析构函数中排除该字段?

    如果_vrtlMem是智能指针,则不。但shared_ptr会为您处理引用计数。

    否则,如果_vrtlMem只是一个原始指针,那么当你不希望它被破坏时,就不要破坏指向的对象。