是否有任何有效的用例可以在现代 C++ 中使用 new 和 delete、原始指针或 c 样式数组?

2024-01-01

这里有一个值得注意的video (停止教学C) https://www.youtube.com/watch?v=YnWhqhNdYyk关于 C++ 语言教学中范式的改变。

还有一篇值得注意的博客文章

我有一个梦想 ... http://dev-jungle.blogspot.co.uk/2015/02/i-have-dream-im-dreaming-of-so-called-c.html

我梦想着所谓的 C++ 课程/班级/课程将停止教授(要求)学生使用:...

自从 C++11 作为既定标准以来,我们有动态内存管理 http://en.cppreference.com/w/cpp/memory设施又名智能指针.
即使从早期的标准来看,我们也有 C++ 标准容器库 http://en.cppreference.com/w/cpp/container作为原始数组的良好替代品(分配有new T[])(特别是使用std::string http://en.cppreference.com/w/cpp/string/basic_string而不是c风格NUL终止字符数组)。

问题在bold:

抛开放置位置new覆盖,是否有任何有效的用例无法使用智能指针或标准容器来实现,而只能使用new and delete直接地(当然除了此类容器/智能指针类的实现之外)?

有时候是这样rumored (like here https://www.quora.com/In-C-how-much-slower-is-it-if-at-all-to-use-std-string-instead-of-char* or here https://www.reddit.com/r/cpp/comments/4g63si/modern_c_ethos_suggests_we_avoid_writing_low/)使用new and delete手卷可以“更高效”对于某些情况。这些实际上是哪些?这些边缘情况不需要像标准容器或智能指针一样跟踪分配吗?

对于原始 c 风格的固定大小数组几乎相同:有std::array如今,它允许各种赋值、复制、引用等轻松且语法一致,正如每个人所期望的那样。是否有任何用例可供选择T myArray[N];c 风格数组优先于std::array<T,N> myArray;?


关于与第三方库的交互:

假设第 3 方库返回分配的原始指针new like

MyType* LibApi::CreateNewType() {
    return new MyType(someParams);
}

您始终可以将其包装到智能指针以确保delete叫做:

std::unique_ptr<MyType> foo = LibApi::CreateNewType();

即使 API 要求您调用他们的旧函数来释放资源,例如

void LibApi::FreeMyType(MyType* foo);

您仍然可以提供删除器功能:

std::unique_ptr<MyType, LibApi::FreeMyType> foo = LibApi::CreateNewType();

I'm especially interested in valid "every day" use cases in contrast to academic/educational purpose requirements and restrictions, which aren't covered by the mentioned standard facilities.
That new and delete may be used in memory management / garbage collector frameworks or standard container implementation is out of question1.


一大动机...

...提出这个问题是为任何(家庭作业)问题提供一种替代方法,这些问题仅限于使用标题中提到的任何结构,但关于生产就绪代码的严重问题。

这些通常被称为basics内存管理,在我看来这是明显错误/误解为适合初学者讲座和任务。


1)Add.: Regarding that paragraph, this should be a clear indicator that new and delete isn't for beginner c++ students, but should be left for the more advanced courses.


当所有权不应该是本地的时。

例如,指针容器可能不希望其中的指针的所有权驻留在指针本身中。如果您尝试编写具有前向唯一指针的链表,则在销毁时您可以轻松地破坏堆栈。

A vector拥有指针的类容器可能更适合在容器或子容器级别存储删除操作,而不是在元素级别。

在这些和类似的情况下,您可以像智能指针一样包装所有权,但您是在更高的级别上进行的。许多数据结构(图等)可能存在类似的问题,其中所有权正确地位于比指针所在的位置更高的位置,并且它们可能不会直接映射到现有的容器概念。

在某些情况下,从数据结构的其余部分中分离出容器所有权可能很容易。在其他情况下可能不会。

有时,您的非本地非引用计数生命周期非常复杂。在这些情况下,没有合理的位置来放置所有权指针。

确定这里的正确性很困难,但并非不可能。存在正确且具有如此复杂的所有权语义的程序。


所有这些都是极端情况,很少有程序员在职业生涯中会多次遇到这些情况。

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

是否有任何有效的用例可以在现代 C++ 中使用 new 和 delete、原始指针或 c 样式数组? 的相关文章

  • Nullable 是不可能的,为什么不呢? [复制]

    这个问题在这里已经有答案了 如果这是一个愚蠢的问题 请原谅 我正在尝试更好地理解 Net 中的 Nullable 类型 从我从 Microsoft 源代码 使用 ReSharper 中注意到的内容 我了解到 Nullable 是一个结构 而
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 如何使用 C# 以编程方式编辑 Power BI Desktop 文档参数或数据源?

    我有一个在 Power BI Desktop 中内置的报告模板 并保存为 pbix 或 pbit 文件 该模板使用DirectQuery SQL数据库作为数据源 而服务器地址和数据库名称被提取到参数中 还有一个参数包含一个ReportId
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • 如何查明 .exe 是否正在 C++ 中运行?

    给定进程名称 例如 程序 exe C 标准库没有这样的支持 您需要一个操作系统 API 来执行此操作 如果这是 Windows 那么您将使用 CreateToolhelp32Snapshot 然后使用 Process32First 和 Pr
  • 类中是否可以有虚拟类声明?

    我正在为个人项目中框架的各个组件设置一个接口 我突然想到了一些我认为可能对接口有用的东西 我的问题是这是否可能 class a public virtual class test 0 class b public a public clas
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 虚拟并行端口模拟器

    在我的计算机网络课程中 我们应该通过使用本机寄存器 例如使用 outportb 等命令 来学习并行端口编程 我没有并行端口 因为我住在 2011 年 但想练习这些程序 我使用 dosbox 安装了旧的 Turboc 3 IDE 有没有一个程
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 如何增加ofstream的缓冲区大小

    我想增加 C 程序的缓冲区大小 以便它不会过于频繁地写入 默认缓冲区是 8192 字节 我尝试使用 pubsetbuf 将其增加到 200K 原始代码 ofstream fq fastq1 cstr ios out fastq1 is a
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 在 C 语言中替换宏内的宏

    我正在尝试使代码部分可重用 我下面的评论片段没有达到我想要的效果 define NAME ABC define LOG SIZE NAME LEN 我想LOG SIZE决心ABC LEN 我尝试过使用 但没能让它发挥作用 LOG SIZE在
  • 在 C++ 代码 gdb 中回溯指针

    我在运行 C 应用程序时遇到段错误 在 gdb 中 它显示我的一个指针位置已损坏 但我在应用程序期间创建了 10 万个这样的对象指针 我怎样才能看到导致崩溃的一个 我可以在 bt 命令中执行任何操作来查看该指针的生命周期吗 谢谢 鲁奇 据我
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 在二进制数据文件的标头中放入什么

    我有一个模拟 可以读取我们创建的大型二进制数据文件 10 到 100 GB 出于速度原因 我们使用二进制 这些文件依赖于系统 是从我们运行的每个系统上的文本文件转换而来的 所以我不关心可移植性 当前的文件是 POD 结构的许多实例 使用 f
  • 初始化列表在 VC10 中不起作用

    我在 VC 2010 中编写了这个程序 class class1 public class1 initializer list
  • 对多个对象使用事件处理程序

    我有 20 件物品List

随机推荐

  • 监控应用程序内存使用情况的正确方法是什么?

    出于调试目的 我编写了这个小静态方法 public static long CheckMemory long maxMemorySizeBytes GC Collect GC WaitForPendingFinalizers GC Coll
  • 无法使用我的窗口应用程序连接到在线数据库。 (C# winforms)

    我注册了一个免费网络托管帐户 该网站提供 MySQL 数据库 我尝试使用 Windows 应用程序访问它 但无法连接到服务器 请考虑我的代码 using System using System Collections Generic usi
  • Android 禁用屏幕保护程序

    我想在应用程序运行时禁用屏幕保护程序 怎样才能做到呢 禁用 启用屏幕保护程序的最佳位置在哪里 在第一个活动中 在application java中 唤醒锁权限必须在清单中指定
  • java局部变量不可用

    我从 Eclipse 调试器中收到以下错误 局部变量不可用 尝试尽可能地修剪代码 问题非常简单 我必须使用 Divise 类中的 DivisiveUI UpdateLog 方法 并使用 Cluster 类中的变量 该部门有一个包含所有集群的
  • miniconda 无法安装 anaconda(安装 anaconda 自定义但没有软件包)

    我正在使用以下脚本以静默模式在计算机上安装 重新安装 最新的 anaconda 长时间运行正常 成功安装anaconda 然而 它最近坏了 现在不是安装所有 anaconda 软件包 而是最终安装 anaconda custom py36h
  • 我们如何复制包含 RSA 密钥的 EVP_PKEY?

    我找到了这个功能EVP PKEY copy parameters 可以复制EVP PKEY 但一些关于此函数的文档说它只能用于 DSA ECC 算法 官方文档 来自openssl org http www openssl org 没有提及该
  • 15 谜题启发式

    The 15 Puzzle是涉及启发式的建模算法的经典问题 此问题常用的启发式方法包括计算错位图块的数量以及计算每个块与其在目标配置中的位置之间的曼哈顿距离之和 请注意 两者都是可接受的 即它们永远不会高估剩余的移动次数 这确保了某些搜索算
  • if 条件从 ruby​​ 数组获取值

    我正在使用以下代码映射一个数组 url http www cnn com page Mechanize new get url images url page images map img img url to s if img width
  • Java 读取文件行并仅提取有用的信息

    我有文件 file1 file2 包含以下内容 2017 02 01 10 00 00 start running error yes doing no finish remind alarmno 123456789 logno 12345
  • 使用最大行长度简洁地序列化 JSON

    因此 我正在生成一个可能很长的 JSON 字符串 以便在 Sendgrid 的 SMTP API 中使用 因为它作为 SMTP 标头 所以它应该具有最大行长度 建议 72 但绝对不超过 1000 文档末尾描述了一种简单的解决方案 http
  • 端点 SWS 没有适配器

    我正在尝试使用创建一个简单的 Hello World WebServicethis http static springsource org spring ws sites 2 0 reference html tutorial html教
  • 在 Android 中格式化 EditText 的电话号码

    我正在制作一个简单的地址簿应用程序 针对 4 2 它需要姓名 地址 城市 州 邮政编码和电话 我想将输入的电话号码格式化为电话号码 XXX XXX XXXX 但我需要将值作为字符串取出 以便在保存时可以将其存储在数据库中 我怎样才能做到这一
  • 从 Internet Explorer 检索所有 cookie

    我正在尝试检索与我打开的特定页面 我已经通过身份验证 关联的所有 cookie 有多个与该网页关联的 cookie 我需要检索每个 cookie 以便稍后进行 POST 我尝试了几种方法 但没有一个给我完整的列表 到目前为止 我已经用 VB
  • 如何在 VS Code 中调试 scala sbt 项目

    我正在尝试在 vs code 中调试 sbt 项目 我已经下载了 VS Code 扩展名 scala Metals 如何在 scala Metal 中显式添加 build sbt 文件夹路径 如何在 scala Metal 中显式添加 bu
  • D3 非连续日期域在 X 轴上产生间隙

    我想绘制一些不连续的时间序列数据 周末 假期等日期的间隙 这是每日数据 数据看起来像这样 date value 1 2 15 109 33 1 5 15 106 25 1 6 15 106 26 1 7 15 107 75 1 8 15 1
  • 忽略Excel求和公式中的隐藏列

    我基本上想忽略Excel中的随机列 有没有办法检测某列是否隐藏 然后不在公式中包含该列 例子是 F1 B1 C1 E1 忽略D列 但第二天 F 栏可能需要 B D E 来代替 有没有办法简单地实现这一目标 我见过一些忽略特定列的公式 但没有
  • 如何检查 Magento 产品是否已添加到购物车?

    我想在 Magento 中首次将产品添加到购物车时显示弹出窗口 并且不想在再次添加或更新产品时显示弹出窗口 简而言之 我想知道将要添加到购物车中的产品是第一次出现还是不是第一次出现 答案很大程度上取决于您想要如何处理父 子类型产品 如果需要
  • 同一应用程序中可以加载不同版本的 DLL 吗?

    我的应用程序使用一个版本的库 a dll 我使用另一个 DLL b dll 它又使用我使用的同一库 a dll 的旧版本 我正在通过嵌入清单文件来构建应用程序 我使用的 DLL 也使用嵌入式清单文件 我的 WinSXS 文件夹中有两个版本的
  • 无法访问 Heroku 上的作曲家供应商文件夹

    我在 Heroku 上托管一个 PHP 应用程序 它使用 Composer 安装 Bootstrap 当我将应用程序部署到 Heroku 时 所有 Composer 依赖项都按预期安装在 vendor 子目录中 我现在尝试将 Bootstr
  • 是否有任何有效的用例可以在现代 C++ 中使用 new 和 delete、原始指针或 c 样式数组?

    这里有一个值得注意的video 停止教学C https www youtube com watch v YnWhqhNdYyk关于 C 语言教学中范式的改变 还有一篇值得注意的博客文章 我有一个梦想 http dev jungle blog