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

Is it possible for the destructor to NOT call the destructor of a specific field?

本文关键字:析构函数 字段 是否 调用      更新时间:2023-10-16

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

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

其中一个类VirtualMemory初始化另一个名为OurPointer的类的几个对象,方法是给它们一个整数和一个指向自身的指针。

该程序运行多个指针,这些指针都链接到同一个虚拟内存。OurPointer的构造函数看起来是这样的:

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

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

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

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

只有当:

  1. 你已经编码了一个析构函数来实现这一点,例如:

    OurPointer::~OurPointer()
    {
    delete _vrtlMem;
    }
    
  2. _vrtlMem是一个类似于std::auto_ptrstd::unique_ptr的智能指针,它们在被指向对象自身被销毁时销毁它们。

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

这正是C++11的std::shared_ptr所设计的那种情况。在清除对共享对象的所有引用之前,不会对其进行销毁。

由于您没有使用C++11,因此可以使用boost::shared_ptr,也可以手动实现引用计数。

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

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

否则,如果_vrtlMem只是一个原始指针,那么当您不希望对指向的对象进行销毁时,就不要对其进行销毁。