2

为了使用带有智能指针的不完整类型,例如boost::scoped_ptr,必须在相应的 CPP 文件中为父类显式定义一个空析构函数。例子:

// H file
class Foo
{
public:
  ~Foo();

private:
  class Pimpl;
  boost::scoped_ptr<Pimpl> pimpl_;
};

// CPP file
class Foo::Pimpl {};

Foo::~Foo() {}

boost::scoped_ptr编译器究竟将' 的析构函数的实例化放在哪里?我试图从视觉上想象它在这些源文件中的位置,就好像我自己明确定义了 scoped_ptr 的析构函数一样。以这种方式想象是否合理?

我知道模板方法和类在与该类型一起使用之前不会为该类型实例化,但我现在正试图从结构上考虑它,如果编译器实际上是手写的,它会将它放在哪里。这将帮助我更好地理解如何使用这些技术(如上面的技术)。

此外,我不确定模板类的整个定义是否被实例化,或者只是它的相关部分,因为它们被使用。换句话说,是否有可能只boost::scoped_ptr存在 ' 的整个定义的一部分?

4

1 回答 1

2

我觉得我从你的问题中遗漏了一些东西。

此示例中只使用了一个主体 (".cpp") 文件,所以它放在那里。更准确地说,它与析构函数进入同一个目标文件(“.o”、“.obj”等)。语言标准没有指定这一点,但这就是我熟悉的所有实现方式。

于 2012-11-26T20:16:16.440 回答