- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
boost::scoped_ptr
documentation包含一个称为 Handle/Body Idiom 的技术示例。它是用以下文字描述的:
The scoped_ptr_example_test.cpp sample program includes a header file, scoped_ptr_example.hpp, which uses a scoped_ptr<> to an incomplete type to hide the implementation.
然而,与此同时,在documentation for checked_delete
据称:
A particularly troublesome case is when a smart pointer's destructor, such as boost::scoped_ptr::~scoped_ptr, is instantiated with an incomplete type. This can often lead to silent, hard to track failures. The supplied function and class templates can be used to prevent these problems, as they require a complete type, and cause a compilation error otherwise.
scoped_ptr
在其实现中确实使用了 checked_delete
。在我看来,这两段经文似乎相互矛盾。此外,我未能编译我的代码,该代码试图使用以下消息来使用建议的技巧:
checked_delete.hpp:32: error: invalid application of 'sizeof' to
incomplete type 'MyClass'
确实,scoped_ptr
的文档是错误的,还是我错过了什么?
最佳答案
他们并不矛盾。因为scoped_ptr
是一个模板,由于代码中没有显式实例化,所以每个方法都是按需实例化。这意味着类型必须在 ~scoped_ptr<>
之前完成。被实例化,在这种情况下,它在保留类型完成后位于 .cpp 文件中(查找接近文件末尾的 example::~example(){}
,这是 ~scoped_ptr<>
被实例化的地方)
对于用户定义的析构函数,这实际上是一个有趣的用例,它看起来与编译器生成的析构函数完全相同,但允许您控制析构的何处/何时碰巧用一些智能指针启用了 PIMPL 模式。如果未声明和定义析构函数,则编译器会在需要的地方隐式定义析构函数,类型不完整,导致UB。
关于c++ - boost::scoped_ptr 文档不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7887652/
我是 boost 库的新手,正在尝试 boost::scoped_ptr,它声明无法复制或移动此智能指针。但是我在玩一些代码时发现了一个问题。我能够创建 scoped_ptr 的新实例并使用现有的有效
我有一个具有以下结构的单例: // Hpp class Root : public boost::noncopyable { public: ~Root();
既然 scoped_ptr 保证给定线程中的所有对象都以类似堆栈的方式分配,那么为 scoped_ptr > , 事实上 std::vector*存储在 scoped_ptr 中与std::vecto
这个问题在这里已经有了答案: 关闭 9 年前。 Possible Duplicate: What is a smart pointer and when should I use one? 我正在阅
我有一个结构 typedef struct myStruct_st { int a; }myStruct; 可以使用创建 myStruct * myStruct_new() { printf(
假设我实现了一个scoped_ptr: template class scoped_ptr { public: scoped_ptr() = delete; explicit scoped
我的类的一个成员是 boost::scoped_ptr,它在创建对象时设置为 (T*)0。该类有一个 init() 方法,它实际上用一个新对象初始化智能指针。 但是,如果在智能指针具有有效引用之前抛出
谁能解释为什么这个例子中引用类型的转换失败了?我想使用 boost::scoped_ptr 作为缺少 std::unique_ptr 的解决方法。 struct A{}; struct B {
我很惊讶编译器拒绝编译这种代码: class A { virtual ~A() {} }; class B : public A { virtual ~B() {} void foo() {} };
我在 pagePtr.h 中有这样的东西 typedef int (*FunPtrType)(char* sz, unsigned int max_bytes, char* arg1, char* a
我正在尝试理解 boost::scoped_ptr 的语法.让我们定义并写入标准输出 a scoped_ptr指针及其指向的值: #include #include int main() {
通常我会遵循 Google 风格指南,我觉得它与我看待事物的方式非常吻合。我也几乎完全使用 boost::scoped_ptr 以便只有一个管理器拥有特定对象的所有权。然后我传递裸指针,我的想法是我的
检查以下代码: 这个有效: T *p = (std::find( this->first(), this->last(), *pPos )); if( p != last() ) { this
我正在使用可变参数模板,我想找到解压参数的好方法 template class MetaKernel : public MyKernel { public: MetaKernel (
我使用 boost::scoped_ptr 实现了一个简单的单例: template class Singleton : public boost::noncopyable { public:
所以我尝试围绕 boost.extension 函数创建一些包装器来创建类。所以我创建了一个函数: template boost::scoped_ptr get_class (shared_lib
我在像这样的小函数中使用 scoped_ptr。这样我就不必调用 delete 了。这是这种用法的矫枉过正吗?我的团队成员更喜欢原始指针和删除。如果这恰好用在非常关键的路径中,那么使用 scoped_
我刚刚开始使用 C++ boost 库。我在很多地方读到,当使用 scoped_ptr 时,即使出现异常,对象也总是被销毁。 They behave much like built-in C++ po
我正在研究智能指针,尤其是 scoped_ptr。我阅读了运算符 * 和 ->。我试着运行这段代码: int main(){ boost::scoped_ptrnumber(new int);
boost::scoped_ptr documentation包含一个称为 Handle/Body Idiom 的技术示例。它是用以下文字描述的: The scoped_ptr_example_tes
我是一名优秀的程序员,十分优秀!