是否应该始终使用 boost::ptr_vector 代替 std::vector ?

2024-04-08

这只是我遇到的一个概念性问题。在我当前的项目中,感觉我过度使用了 boostsmart_ptr and ptr_container图书馆。我正在创造boost::ptr_vectors在许多不同的对象中,并调用 Transfer() 方法从一个对象中移动某些指针boost::ptr_vector到另一个。

我的理解是,清楚地显示堆分配对象的所有权非常重要。

我的问题是,是否需要使用这些 boost 库来创建属于某个对象的堆分配成员,然后通过以下方式使用指向这些成员的普通指针get()进行任何处理时。

例如... 一个游戏可能有一组属于它的图块。在以下位置创建这些图块可能是有意义的:boost::ptr_vector。游戏结束后,这些图块应自动释放。

但是,如果我想暂时将这些 Tiles 放入 Bag 对象中,我是否应该创建另一个boost::ptr_vector放入袋子中,然后通过以下方式将游戏的图块转移到袋子中:transfer()或者 我应该创建一个std::vector<Tile*>其中 Tiles* 引用 Tiles 在游戏中并将其传递给袋子?

Thanks.

**编辑 我应该指出,在我的示例中,游戏将有一个 Bag 对象作为成员。袋子里只会装满游戏拥有的图块。所以如果没有游戏,袋子就不会存在。


您应该只在明确的地方使用拥有的智能指针和指针容器transfer所有权。对象是否是临时的并不重要,重要的是它是否拥有所有权(因此,前一个所有者是否放弃所有权)。

如果您创建一个临时指针向量只是为了将其传递给其他函数,而原始的ptr_vector仍然引用所有这些对象,没有所有权转移,因此您应该使用普通vector对于临时对象 - 就像您使用原始指针传递单个对象一样ptr_vector指向一个接受指针但不将其存储在任何地方的函数。

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

是否应该始终使用 boost::ptr_vector 代替 std::vector ? 的相关文章

  • Qt-Qlist 检查包含自定义类

    有没有办法覆盖加载自定义类的 Qt QList 的比较机制 即在 java 中你只需要重写一个比较方法 我有一个带有我的自定义类模型的 QList QList
  • 当我使用“control-c”关闭发送对等方的套接字时,为什么接收对等方的套接字不断接收“”

    我是套接字编程的新手 我知道使用 control c 关闭套接字是一个坏习惯 但是为什么在我使用 control c 关闭发送进程后 接收方上的套接字不断接收 在 control c 退出进程后 发送方的套接字不应该关闭吗 谢谢 我知道使用
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • 使闭包捕获的变量变得易失性

    闭包捕获的变量如何与不同线程交互 在下面的示例代码中 我想将totalEvents 声明为易失性的 但C 不允许这样做 是的 我知道这是错误的代码 这只是一个例子 private void WaitFor10Events volatile
  • 当 contains() 工作正常时,xpath 函数ends-with() 工作时出现问题

    我正在尝试获取具有以特定 id 结尾的属性的标签 like span 我想获取 id 以 国家 地区 结尾的跨度我尝试以下xpath span ends with id Country 但我得到以下异常 需要命名空间管理器或 XsltCon
  • C - 找到极限之间的所有友好数字

    首先是定义 一对友好的数字由两个不同的整数组成 其中 第一个整数的除数之和等于第二个整数 并且 第二个整数的除数之和等于第一个整数 完美数是等于其自身约数之和的数 我想做的是制作一个程序 询问用户一个下限和一个上限 然后向他 她提供这两个限
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • C#:如何防止主窗体过早显示

    在我的 main 方法中 我像往常一样启动主窗体 Application EnableVisualStyles Application SetCompatibleTextRenderingDefault false Application
  • Cython 和类的构造函数

    我对 Cython 使用默认构造函数有疑问 我的 C 类 Node 如下 Node h class Node public Node std cerr lt lt calling no arg constructor lt lt std e
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 使用 System.Text.Json 即时格式化 JSON 流

    我有一个未缩进的 Json 字符串 例如 hash 123 id 456 我想缩进字符串并将其序列化为 JSON 文件 天真地 我可以使用缩进字符串Newtonsoft如下 using Newtonsoft Json Linq JToken
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • Github Action 在运行可执行文件时卡住

    我正在尝试设置运行google tests on a C repository using Github Actions正在运行的Windows Latest 构建过程完成 但是当运行测试时 它被卡住并且不执行从生成的可执行文件Visual
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • 如何让Gtk+窗口背景透明?

    我想让 Gtk 窗口的背景透明 以便只有窗口中的小部件可见 我找到了一些教程 http mikehearn wordpress com 2006 03 26 gtk windows with alpha channels https web
  • 32 位到 64 位内联汇编移植

    我有一段 C 代码 在 GNU Linux 环境下用 g 编译 它加载一个函数指针 它如何执行并不重要 使用一些内联汇编将一些参数推送到堆栈上 然后调用该函数 代码如下 unsigned long stack 1 23 33 43 save
  • Process.Start 阻塞

    我正在调用 Process Start 但它会阻止当前线程 pInfo new ProcessStartInfo C Windows notepad exe Start process mProcess new Process mProce
  • 限制C#中的并行线程数

    我正在编写一个 C 程序来生成并通过 FTP 上传 50 万个文件 我想并行处理4个文件 因为机器有4个核心 文件生成需要更长的时间 是否可以将以下 Powershell 示例转换为 C 或者是否有更好的框架 例如 C 中的 Actor 框

随机推荐

  • 从 PageAsyncTask 调用的方法中,HttpContext.Current 为 null

    我有一个场景 我有一个页面 单击按钮即可打开一个对话框 在单击按钮打开的对话框表单中 我可以从选定的 txt 文件中读取数据列表并构建查询并将数据添加到某些数据库表 由于可能存在大量数据 此过程可能需要很长时间 因此用户在上传完成之前将无法
  • 使用 MonadRef 实现 MonadCont

    有一个众所周知的问题我们不能使用forall类型在Cont返回类型 https stackoverflow com questions 7178919 how to make callcc more dynamic 7180154 7180
  • 如何检查复选框是否被选中

    我的表格上有复选框
  • “网络错误:404 未找到”/style.css

    我在萤火虫中遇到错误 网络错误 404 未找到 已删除 style css 这意味着什么以及我需要做什么 Thanks HTTP 404 的含义正如其所言 未找到文件 在文档中的某个位置 您链接到 removed style css 并且该
  • Android:如何与WebView的内容进行交互?

    有没有一种方法可以以编程方式与内容进行交互WebView 例如 我的应用程序如何 响应事件 例如点击网页上的按钮 迭代所有的INPUT页面中的元素并检索其内容 找到所有DIV元素与类status并更改其内容 Thanks 您可以使用 Jav
  • setMessageBody 中忽略新行和返回

    我是不是在做一些蠢事 我可以预填写并发送电子邮件 但 r n 在 emailBody 中被忽略 void sendEventInEmail MFMailComposeViewController picker MFMailComposeVi
  • 执行 aapt 时出错:无法运行程序,CreateProcess 错误=5,访问被拒绝:CreateProcess 错误=5,访问被拒绝

    今天 我刚刚使用 Android SDK Manager 更新了 Windows 7 上的 Android SDK 并在 Eclipse 中构建期间开始出现错误 其中显示 执行aapt时出错 无法运行程序 CreateProcess错误 5
  • 如何通过单击按钮打开和关闭引导警报?

    我想通过按钮单击事件多次显示警报框 而无需刷新页面 但警报框仅显示一次 如果我想再次显示警报框 我必须刷新页面 目前 如果您在页面上呈现引导警报 则当您关闭它时 警报的 div 容器将从页面中消失 因此 当您再次单击该按钮时 它就不再显示
  • 如何使用 Subversion 服务器删除和创建新的存储库?

    好吧 我只是做了一些愚蠢的事情 我正在第一次设置一个供承包商使用的颠覆服务器 我完成了一键设置 创建了我的项目 并第一次签入了我们的应用程序 我认为稍后会进行操作并删除配置文件中连接字符串中的密码信息 Duh 所以现在我需要删除存储库中的该
  • 作为装饰器登录与依赖注入 - 如果我需要登录类内部怎么办?

    我最初问这个问题是在这条评论 https stackoverflow com questions 7905110 logging aspect oriented programming and dependency injection tr
  • Tkinter 创建带循环的选项菜单

    我创建了一个代码 使用 for 循环使用字典中的值创建 tkinter OptionMenus 该代码似乎运行成功 OptionMenus 根据需要在窗口上显示带有关键字 import tkinter as tk from tkinter
  • 从事务性平面数据库填充事实表和维度表的最佳实践

    我想在 SSIS SSAS 中填充星型模式 多维数据集 我准备了所有维度表和事实表 主键等 源是一个 平面 项目级别 表 我现在的问题是如何拆分它 并将其从一个放入相应的表中 我做了一些谷歌搜索 但找不到令人满意的解决方案 人们会认为这是
  • C: dup2、pipe 和 fork 未按预期工作

    我正在尝试做一个简单的 fork gt 执行另一个程序 gt 向该子进程说 你好 gt 读回一些内容 gt 打印收到的内容 用作子程序的程序只是等待任何输入行并将某些内容打印到标准输出 例如 你好 这是我的 主机 程序 不起作用 inclu
  • npm 对于 socket.io/installing stuff 意味着什么?

    我在这方面真是个菜鸟 我刚刚开始接触node js socket io html5 之类的东西 我终于弄清楚如何使用命令提示符 使用 Windows 通过命令 node example js 启动 hello world 应用程序 但有什么
  • django-admin.py startproject 打开记事本,而不是创建项目

    嘿 所以基本上 当我尝试 django admin py startproject mysite 时 带有 django admin py 文件的记事本会打开 而不是创建新的实际项目 我在 Windows 上 就在昨天我创建了该项目 一切都
  • 禁用页面上的所有验证控件

    在开发周期的早期阶段 如果我们只想快速地从一个表单移动到另一个表单 那么让所有验证控件强制执行其规则会有点烦人 禁用页面上所有验证器控件的最简单方法是什么 设置一个 javascript 来获取页面中的所有验证器控件 并在 for 循环中将
  • 将观察者添加到 BOOL 变量

    是否可以将观察者添加到简单变量 例如 BOOL 或 NSIntegers 并查看它们何时发生变化 Thanks 您观察键 当它们的值发生变化时会收到通知 数据类型可以是任何类型 对于定义为 Objective C 属性的任何内容 在 h 文
  • Camel如何以流模式处理json?

    为了在流模式下读取 json 并解组 Camel OOB 中有哪些可用选项 如果不是现成的 如何实施 我发现camel xstream 可能会有所帮助 流模式是默认的还是我们需要做其他事情来使其以流模式读取 还有 Jackson Strea
  • 如何在 Symfony 4 中使用事件处理异常?

    现在我正在尝试捕获这样的异常事件 try echo 1 0 catch Exception e subs new ExceptionSubscriber this gt dispatcher gt addSubscriber subs 我定
  • 是否应该始终使用 boost::ptr_vector 代替 std::vector ?

    这只是我遇到的一个概念性问题 在我当前的项目中 感觉我过度使用了 boostsmart ptr and ptr container图书馆 我正在创造boost ptr vectors在许多不同的对象中 并调用 Transfer 方法从一个对