C++ - 通过指针访问向量元素的安全性

2024-03-05

在我的一个 C++ 项目中,我使用的是vector持有一堆struct包含简单游戏的许多元素(即:井字游戏、坐标、x vs o, ETC)。 IE:

struct gameMove
{
  int x;
  int y;
  int player;
  int order;
};

每次在一场游戏中,每当玩家采取行动(即:放置一个x or o),信息存储在vector via push_back(),创建一个“撤消”功能,目前该功能按预期工作。

在我的撤消/重做逻辑的某些部分,我使用的函数遍历vector,找到适当的元素,并直接返回指向该元素的指针。

只要我正确管理,安全吗?vector,访问它,将所有指向该元素的指针置为 NULLvector,或者是否存在固有风险?我担心的是,如果扩展游戏,我计划这样做(即:对我正在开发的国际象棋游戏使用相同的代码),并且vector变得太大并且需要自动重新分配,指针将变得无效(即:整个列表被移动到可以容纳所有元素的新连续块),或者是否有某种类型的智能指针接口vector完成同样的事情?

谢谢。


您的担忧是正确的:如果向量需要增长,则vector会改变(或者如果向量缩小,但大多数实现vector如果没有程序员的努力就不会缩小)。

最简单的解决方案是将索引返回到向量中,而不是指针。只要它在范围内,就始终是查找特定元素的有效方法。 [而不是NULL你可以使用例如-1 or 0xDEAD]

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

C++ - 通过指针访问向量元素的安全性 的相关文章

  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 是否有比 lex/flex 更好(更现代)的工具来生成 C++ 分词器?

    我最近将源文件解析添加到现有工具中 该工具从复杂的命令行参数生成输出文件 命令行参数变得如此复杂 以至于我们开始允许它们作为一个文件提供 该文件被解析为一个非常大的命令行 但语法仍然很尴尬 因此我添加了使用更合理的语法解析源文件的功能 我使
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 像“1$”这样的位置参数如何与 printf() 一起使用?

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 网络参考共享类

    我用 Java 编写了一些 SOAP Web 服务 在 JBoss 5 1 上运行 其中两个共享一个类 AddressTO Web 服务在我的 ApplycationServer 上正确部署 一切都很顺利 直到我尝试在我的 C 客户端中使用
  • 用 C 实现 Unix shell:检查文件是否可执行

    我正在努力用 C 语言实现 Unix shell 目前正在处理相对路径的问题 特别是在输入命令时 现在 我每次都必须输入可执行文件的完整路径 而我宁愿简单地输入 ls 或 cat 我已经设法获取 PATH 环境变量 我的想法是在 字符处拆分
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 更改显示的 DPI 缩放大小使 Qt 应用程序的字体大小渲染得更大

    我使用 Qt 创建了一些 GUI 应用程序 我的 GUI 应用程序包含按钮和单选按钮等控件 当我运行应用程序时 按钮内的按钮和字体看起来正常 当我将显示器的 DPI 缩放大小从 100 更改为 150 或 200 时 无论分辨率如何 控件的
  • 将 viewbag 从操作控制器传递到部分视图

    我有一个带有部分视图的 mvc 视图 控制器中有一个 ActionResult 方法 它将返回 PartialView 因此 我需要将 ViewBag 数据从 ActionResult 方法传递到 Partial View 这是我的控制器
  • 为什么 strtok 会导致分段错误?

    为什么下面的代码给出了Seg 最后一行有问题吗 char m ReadName printf nRead String s n m Writes OK char token token strtok m 如前所述 读取字符串打印没有问题 但

随机推荐

  • Crystal Reports 文本截断详细信息部分中的最后一行

    我有一个 Crystal Report 11 文件 它是一封信 第一个详细信息部分包含一个大文本框 其中包含打印日期 地址块和称呼行 每隔一段时间 文本框的最后一行就会被切断 这样就看不到称呼了 这是非常不一致的 因为有时 我为系统中的一个
  • BlackBerry 中的图像按钮

    如何在 BlackBerry 中实现图像按钮 在这里 完整的代码 import net rim device api system Bitmap import net rim device api ui Graphics import ne
  • Python 将 args 转换为 kwargs

    我正在编写一个装饰器 它需要在调用它正在装饰的函数之前调用其他函数 装饰函数可以具有位置参数 但装饰器将调用的函数只能接受关键字参数 有人有一种将位置参数转换为关键字参数的便捷方法吗 我知道我可以获得修饰函数的变量名列表 gt gt gt
  • 正确的 javascript 继承

    我读了很多关于 javascript 中 继承 的文章 其中一些使用new当其他人推荐时Object Create 我读得越多 就越感到困惑 因为似乎存在无数的变体来解决继承问题 有人可以向我展示最受接受的方式 或者事实上的标准 如果有的话
  • 为什么动态更新 DOM 时 html 源不会改变

    我之前发过一个问题jQuery 在 IE 8 和 FF 3 5 8 中设置只读属性不一致 https stackoverflow com questions 2381621 jquery inconsistency in setting r
  • @error 指令不在 Laravel 视图中显示错误

    我正在研究自定义 Laravel 登录实现 我已从控制器返回错误 如下所示 credentials request gt only email password if Auth attempt credentials Authenticat
  • 如何在android上获取处理器编号

    大家好 我想获取android上的处理器编号 我可以这样做吗 int processporNum sysconf SC NPROCESSORS CONF 但每次在我的某些手机上返回值都是1 所以我不确定这个方法是否正确 是否有其他API可以
  • matplotlib 绘图 沿绘图线的标签

    matplotlib 社区的一份 假设我有一条直线 plot 37 45 0 67778 0 67778 k lw 1 2 我可以沿着线而不是在图例中向该线添加标签吗 即 类似于以下内容 但不是等高线图 只是普通的线图 下面是一个例子 只是
  • OpenSSl + PHP如何实现[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我需要在项目中使用 openSSL
  • 如何删除pandas中每组的第一行

    我有一个像这样的数据框 id values 0 1 3 1 1 6 2 1 3 3 2 7 4 2 6 5 2 3 6 2 9 我想根据删除每组的第一行id 结果应该是这样的 id values 1 1 6 2 1 3 4 2 6 5 2
  • 使用 JS 将任何标签内的文本复制到剪贴板[重复]

    这个问题在这里已经有答案了 我需要复制 p 标签内的文本 我尝试使用以下代码 HTML p Text to copy p
  • Subversion 中的合并比 Team Foundation System 中的合并更困难吗?

    我习惯了使用TFS 我的公司现在正在为一个新项目切换到SVN 主要原因是为了更好地将我们的java和 Net代码库合并在同一源代码控制下 我被赋予理解颠覆中的合并是困难的 杰夫提到了这一点 https blog stackoverflow
  • java中的cloneable接口有什么用?

    实现可克隆接口有什么用 因为它是一个标记接口 我总是可以在我的类中创建一个公共 Object clone 方法 可克隆接口的实际用途是什么 那是因为clone 方法抛出CloneNotSupportedException如果你的对象不是Cl
  • 如何调用我们的应用程序并获取来电的详细信息?

    如果我的应用程序中保存了任何号码 并且该用户在我的 iPhone 上呼叫我 那么我想通过屏幕调用我的应用程序 用户可以在屏幕上填写有关该呼叫的信息 例如呼叫持续时间 呼叫者姓名和一些应用程序特定的详细信息 请指导我如何在 iOS 中实现通话
  • 在 C 中声明数组而不指定大小

    当像这样声明一个数组时 int array 1 2 3 4 5 6 我收到一条错误消息 数组类型具有不完整的元素类型 到底是怎么回事 对于N维数组 N gt 0 需要定义N 1维的大小 只能留下一个维度供编译器确定 并且它必须是第一个维度
  • 逐行分割字符串并进行变量化,即将其分配给 GITHUB_OUTPUT - 工作流程

    Github 行动run调用 powershell 返回如下 Powershell返回函数 return psitem Key psitem Value 返回值被分配给 github 操作变量 returnvalue 返回包含一个列表key
  • 使用自定义项目模板在组合框中显示所选项目

    我使用此页面中的代码来设计我的组合框的样式 如何在鼠标悬停时设置组合框背景的样式 https stackoverflow com a 5564151 2848002 我更改了默认项目模板 但现在它们不会出现在所选值区域中 在下图中 您可以看
  • 如何从 XML 文件中删除不可见的垃圾字符

    我想读取一些 xml 文件 当我用记事本 写字板 MS Word 或任何浏览器打开这些文件时 它以其原始形式打开 但是当我尝试用 MS DOS 执行它时 会出现一个看不见的字符 如 被看到 我认为 正在创建一个错误 我发现错误 序言中不允许
  • 防止 System.Window.Forms.ComboBox 的自动选择行为 (C#)

    背景 我有一个Forms ComboBox with a DropDownStyle DropDown 我不使用AutoComplete 但我实现了类似的东西 它不仅过滤文本的开头 而且使用正则表达式并显示与输入的文本匹配的所有项目 这很好
  • C++ - 通过指针访问向量元素的安全性

    在我的一个 C 项目中 我使用的是vector持有一堆struct包含简单游戏的许多元素 即 井字游戏 坐标 x vs o ETC IE struct gameMove int x int y int player int order 每次