我正在使用带有-std=c++0x
标志的C ++编译器。
我正在为类编写虚拟内存系统的模拟,并遇到了一个问题:
其中一个类VirtualMemory
通过给它们一个整数和一个指向自身的指针来初始化一个名为OurPointer
的不同类的几个对象。
程序运行几个指针,这些指针都链接到同一个虚拟内存。
OurPointer
的构造函数如此:
OurPointer::OurPointer(int adr , VirtualMemory* vrtlMem)
{
_adr = adr;
_vrtlMem = vrtlMem;
}
这是因为OurPointer
用于处理VirtualMemory
。问题是,每次销毁OurPointer
对象时,它都会调用_vrtlMem
的析构函数,该析构函数指向程序仍在使用的同一VirtualMemory
对象。
有没有办法从析构函数中排除该字段?我试图把它变成一个静态字段,或者更改指针,但它并没有停止析构函数。
答案 0 :(得分:1)
问题是,每次销毁OurPointer对象时,它都会调用_vrtlMem的析构函数
只有在以下情况下才会这样:
您已经编写了一个析构函数来执行此操作,例如:
OurPointer::~OurPointer()
{
delete _vrtlMem;
}
_vrtlMem
是一个智能指针,如std::auto_ptr
或std::unique_ptr
,当它们自身被破坏时会破坏指向的对象。
指向程序仍在使用的同一个VirtualMemory对象。
这正是C ++ 11 std::shared_ptr
设计的那种情况。在完成对它的所有引用之前,不会破坏共享对象。
由于您没有使用C ++ 11,您可以使用boost::shared_ptr
代替,或者您可以手动实现引用计数。
有没有办法从析构函数中排除该字段?
如果_vrtlMem
是智能指针,则不。但shared_ptr
会为您处理引用计数。
否则,如果_vrtlMem
只是一个原始指针,那么当你不希望它被破坏时,就不要破坏指向的对象。