带 unique_ptr 的受保护析构函数

2023-12-05

我正在尝试从第三方库调用 API。

当我想将 unique_ptr 与具有受保护析构函数的类一起使用时,会出现问题。

这是例子,

#include <memory>
#include <iostream>

using namespace std;

class Parent {  
  public:  
    Parent () //Constructor
    {
        cout << "\n Parent constructor called\n" << endl;
    }
  protected:
    ~ Parent() //Dtor
    {
        cout << "\n Parent destructor called\n" << endl;
    }
};

class Child : public Parent 
{
  public:
    Child () //Ctor
    {
        cout << "\nChild constructor called\n" << endl;
    }
    ~Child() //dtor
    {
        cout << "\nChild destructor called\n" << endl;
    }
};

Parent* get() {
  return new Child();
}

int main(int argc, char const* argv[])
{
  Parent * p1 = get(); // this is ok
  std::unique_ptr<Parent> p2(get()); // this is not ok
  return 0;
}

我正在尝试将 unique_ptr 与父类一起使用。但编译器抛出了错误

/usr/include/c++/5/bits/unique_ptr.h: In instantiation 
of ‘void std::default_delete<_Tp>::operator()(_Tp*) const 
[with _Tp = Parent]’:
/usr/include/c++/5/bits/unique_ptr.h:236:17:   required 
from ‘std::unique_ptr<_Tp, _Dp>::~unique_ptr() [with _Tp 
= Parent; _Dp = std::default_delete<Parent>]’
main.cpp:38:35:   required from here
main.cpp:12:5: error: ‘Parent::~Parent()’ is protected
 ~ Parent() //Dtor
 ^
In file included from /usr/include/c++/5/memory:81:0,
             from main.cpp:2:
/usr/include/c++/5/bits/unique_ptr.h:76:2: error: within 
this context
  delete __ptr;

有什么想法可以摆脱这个问题吗?我无法破解 Parent 和 Child 类,因为它们是第三方库的类。


你(们)能做到std::default_delete<Parent>的朋友Parent修复该错误。你可能还想制作~Parent virtual以避免未定义的行为delete通过派生类Parent指针。

E.g.:

class Parent { 
    friend std::default_delete<Parent>;
    // ...
protected:
    virtual ~Parent();
    // ...

然而,Parent设计清楚地表明你不应该delete通过Parent指针,这就是为什么析构函数是非公开的。读虚拟性更多细节:

准则#4:基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的。


您可能想引入另一个中间基类来解决该问题:

class Parent { // Comes from a 3rd-party library header.
protected:
    ~Parent();
};

struct MyParent : Parent {  // The intermediate base class.
    virtual ~MyParent();
};

class Derived : public MyParent {};

std::unique_ptr<MyParent> createDerived() {
    return std::unique_ptr<MyParent>(new Derived);
}

int main() {
    auto p = createDerived();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带 unique_ptr 的受保护析构函数 的相关文章

  • 在路由mvc 4中添加公司名称

    我一直在尝试为 Facebook 等用户提供在 URL 中添加公司名称的选项 http localhost 50753 MyCompany Login 我尝试过不同的网址 但没有成功 routes MapRoute name Default
  • 删除是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 C 编程 free 如何知道要释放多少 https stackoverflow com questions 1518711 c programming how does free know how m
  • 有没有办法在 xcode 上使用 c++0x ?我想使用 gcc 4.4 或更高版本

    我想使用 gcc 4 4 或更高版本进行 iphone 开发 有人知道怎么做吗 不 你不知道 相信我 你不会 Apple 仍保留 gcc 4 2 1 因为 4 2 2 及更高版本使用 GPLv3 这意味着他们必须放弃对其平台的控制 对于 i
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 如何在三个 IEnumerable 上使用 Zip [重复]

    这个问题在这里已经有答案了 可能的重复 使用 Linq 从 3 个集合创建项目 https stackoverflow com questions 5284315 create items from 3 collections using
  • 析构函数中的异步操作

    尝试在类析构函数中运行异步操作失败 这是代码 public class Executor public static void Main var c1 new Class1 c1 DoSomething public class Class
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 如何从 Rx Subscribe 回调异步函数?

    我想回调 Rx 订阅中的异步函数 例如 像那样 public class Consumer private readonly Service service new Service public ReplaySubject
  • Linux mremap 不释放旧映射?

    我需要一种方法将页面从一个虚拟地址范围复制到另一个虚拟地址范围 而无需实际复制数据 范围很大 延迟很重要 mremap 可以做到这一点 但问题是它也会删除旧的映射 由于我需要在多线程环境中执行此操作 因此我需要旧映射能够同时使用 因此稍后当
  • 从浏览器访问本地文件?

    您好 我想从浏览器访问系统的本地文件 由于涉及大量安全检查 是否可以通过某种方式实现这一目标 或使用 ActiveX 或 Java Applet 的任何其他工作环境 请帮帮我 要通过浏览器访问本地文件 您可以使用签名的 Java Apple
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • CUDA 8 编译错误 -std=gnu++11

    我正在尝试转换一些代码以使用 CUDA 并且我认为我遇到了兼容性问题 我们使用CMake 这些是我使用的 gcc 和 CUDA 版本 gcc version gcc Ubuntu 5 4 0 6ubuntu1 16 04 5 5 4 0 2
  • 需要提取字符串中点后的最后一个数字,如“7.8.9.1.5.1.100”

    我需要提取 C 字符串中最后一个点后面的最后一个数字 例如 7 8 9 1 5 1 100 并将其存储在整数中 Added 该字符串也可以是 7 8 9 1 5 1 1 或 7 8 9 1 5 1 0 我还想验证它在最后一个点之前恰好是 7
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 使用未分配的局部变量

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • RegSvr32.exe 的 /n 和 /i 参数有什么不同?

    要注册 COM 服务器 我们在提升模式下运行类似的命令 regsvr32 exe com dll 要执行每用户注册 请在用户帐户中执行 regsvr32 exe n i user com dll regsvr32 exe 支持以下参数 u
  • 在 Python 日志记录中跨多个模块访问记录器

    我有一个关于 python 日志记录模块的小问题 我有一个简单的记录器 记录器 basicConfig 如何使用 getLogger 访问同一个记录器 或者 getLogger 是否为我提供了一个我可以访问的日志记录对象 如果是这样 我如何
  • 在Python中比较整数中的数字

    这里确实需要一些帮助 学习 Python 的超级早 目标是获取一个数字并查看数字是否按升序排列 到目前为止我所拥有的是 a int input Enter a 4 digit number b int i for i in str a if
  • 转换日期格式 yyyy-MM-dd'T'HH:mm:ss.SSS

    我有几个NSDate包含符合此格式的值的对象yyy MM dd T HH mm ss SSS 当我尝试转换为不同的格式时 例如MMM dd yyyy HH mm格式化程序总是返回nil 但是 如果我对字符串值进行硬编码 我将通过NSDate
  • Moq 模拟和跟踪会话值

    我在使用 Moq 进行模拟返回会话值集时遇到问题 使用以下内容 public class TestHelpers public long sessionValue 1 public HttpContextBase FakeHttpConte
  • 我的网页周围的 CSS 边框

    我目前在网站周围定位边框时遇到一些问题 我目前正在托管该网站here 我想要一个黄色边框围绕身体 但距离边缘大约 20 30 像素 我还希望边框具有响应能力 因此当我调整浏览器大小时 边框也会跟随 我尝试过的所有方法都不起作用 有人知道我需
  • 检查目标 c 中的字符串是否为回文

    我正在尝试检查字符串是否是回文或不使用 Objective C 我是编程新手 没有任何其他编程语言的经验 所以请耐心等待 我陷入了 if 条件 我想让它说 如果字符串中的第一个位置等于最后一个位置 则字符串是回文 我究竟做错了什么 int
  • 如何将 SOAP 响应转换为 PHP 数组?

    我无法将 SOAP 响应转换为 php 中的数组 这是代码 response client gt doRequest xmlRequest location action 1 这是 SOAP 响应
  • Boost DFS如何保存访问过的顶点?

    我正在看解决方案here 这对我不起作用 但在 行下阅读以实际查看当前问题 I tried boost undirected dfs G vertex 0 G boost visitor vis 但我得到 error C2780 void
  • 出现错误无法解析对程序集 System.Web 的依赖关系

    我不得不更换我的主硬盘 昨天我的 HD 被我们的 IT 技术人员更换了 所以今天 在安装 VS 2015 后 我开始开发我们一直在开发的 WPF 应用程序 我进入了该项目 从 TFS 获取最新信息并进行了构建 我失败并出现以下错误 无法解析
  • 跨 Qt 线程共享数据

    我是 Qt 的新手 所以请原谅问题的简单性 但我对 Qt 线程有点困惑 假设我有 3 个线程 主默认 GUI 线程和我自己创建的 2 个线程 称为 WorkerThread 我的每个 WorkerThreads 都继承自 QThread 并
  • 如何保护 Android 共享首选项的安全?

    常见的位置在哪里SharedPreferencesAndroid应用程序中存储的内容是 data data
  • BlackBerry - 图像 3D 变换

    我知道如何以任意角度旋转图像绘制纹理路径 int displayWidth Display getWidth int displayHeight Display getHeight int x new int 0 displayWidth
  • 加载 Comet/服务器推送 iframe 时停止浏览器“厄运的悸动”

    当使用 Comet 或 Ajax Long Pull 技术时 通常使用 iframe 当 iframe 等待长连接关闭时 浏览器正在旋转其 throbber 进度 加载指示器 一些网站 例如 etherpad com 设法让它停止 他们是如
  • UIImagePickerControllerEditedImage 的问题

    我需要在将图像导入应用程序之前对其进行编辑 但编辑图像后会降低一些质量 如何避免这种情况 void imagePickerController UIImagePickerController picker didFinishPickingM
  • Javascript:比较“2 == true”的困惑

    这是一个 JavaScript 比较 2 true false 据说 之所以返回 false 是因为比较转换了true to Number数据类型 结果为 1 console info Number true 1 我的困惑是 为什么比较不转
  • 如何更改 Django 管理中的foreignkey显示文本?

    如何更改显示文本
  • Symfony 2 实体存储库 find() 返回空数组

    从现在开始谢谢大家的回答 这就是问题所在 我有一个 symfony 2 应用程序 有两个实体 任务和产品 当我尝试查找 findBy findOneBy findAll 产品时 它返回一个空数组 任务实体
  • 如何在 mongodb 中表示线程评论(以及评论投票)的数据?

    对于我的博客 我想合并我自己的评论系统 而不依赖于默认的 WordPress 评论系统 我需要使用评论模块mongodb代替mysql该模块需要以下支持 线索评论 评论投票 需要对整个博客的每个评论作者汇总评论投票 在这种情况下 在 mon
  • 带 unique_ptr 的受保护析构函数

    我正在尝试从第三方库调用 API 当我想将 unique ptr 与具有受保护析构函数的类一起使用时 会出现问题 这是例子 include