创建对象:有或没有“new”[重复]

2023-11-30

可能的重复:
使用 new 实例化对象与不使用 new 实例化对象有什么区别

这可能是一个基本问题,并且可能已经被问过(例如,here);但我还是不明白。那么,让我问一下。

考虑以下 C++ 类:

class Obj{
    char* str;
public:
    Obj(char* s){
        str = s;
        cout << str;
    }
    ~Obj(){
        cout << "Done!\n";
        delete str;        // See the comment of "Loki Astari" below on why this line of code is bad practice
    }
};

以下代码片段有什么区别:

Obj o1 ("Hi\n");

and

Obj* o2 = new Obj("Hi\n");

为什么前者调用析构函数,而后者不调用析构函数(没有显式调用delete)?

哪一个是首选?


两者都做不同的事情。

第一个创建一个对象自动存储时长。它被创建、使用,然后在当前块 ({ ... })结束。这是创建对象的最简单方法,与编写时一样int x = 0;

第二个创建一个对象动态存储持续时间并允许两件事:

  • 精细控制对象的生命周期,因为它不会自动超出范围;您必须使用关键字显式销毁它delete;

  • 创建大小仅在运行时已知的数组,因为对象创建发生在运行时。 (我不会在这里讨论分配动态数组的细节。)

两者都不是优选的;这取决于您正在做什么,哪一个最合适。

除非需要使用后者,否则请使用前者。

你的 C++ 书籍应该很好地介绍了这一点。如果你没有的话,别再走了直到你购买并阅读多次,其中之一.


您的原始代码已损坏,因为它deletes a char数组它没有new。实际上,nothing newd C 风格字符串;它来自字符串文字。delete这是一个错误(尽管不会生成编译错误,但会在运行时产生不可预测的行为)。

通常一个对象不应该承担以下责任:deleteing 任何它本身没有的东西new。这种行为应该有详细记录。在这种情况下,规则就被彻底打破了。

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

创建对象:有或没有“new”[重复] 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • 为什么libc++的shared_ptr实现使用完整内存屏障而不是宽松内存屏障?

    在boost的实现中shared ptr 它用放松内存排序以增加其引用计数 https github com boostorg smart ptr blob master include boost smart ptr detail sp
  • ASP.NET MVC 中的经典 ASP (C#)

    我有一个应用程序想要 最终 转换为 ASP NET MVC 我想要进行全面的服务升级 到 ASP NET 但想要使用当前的 ASP 内容来运行当前的功能 这样我就可以在对新框架进行增量升级的同时升级小部分 该站点严重依赖于不太成熟的 VB6
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 使用post方法将多个参数发送到asp.net core 3 mvc操作

    使用 http post 方法向 asp net mvc core 3 操作发送具有多个参数的 ajax 请求时存在问题 参数不绑定 在 dot net 框架 asp net web api 中存在类似的限制 但在 asp net mvc
  • 对齐 GridView 中的行值

    我需要在 asp net 3 5 中右对齐 gridview 列中的值 我怎样才能做到这一点
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • C++ 异步线程同时运行

    我是 C 11 中线程的新手 我有两个线程 我想让它们同时启动 我可以想到两种方法 如下 然而 似乎它们都没有按照我的预期工作 他们在启动另一个线程之前启动一个线程 任何提示将不胜感激 另一个问题是我正在研究线程队列 所以我会有两个消费者和
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 如何从网站下载 .EXE 文件?

    我正在编写一个应用程序 需要从网站下载 exe 文件 我正在使用 Visual Studio Express 2008 我正在使用以下代码 private void button1 Click object sender EventArgs
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 如何重置捕获像素的值

    我正在尝试创建一个 C 函数 该函数返回屏幕截图位图中每四个像素的 R G 和 B 值 这是我的代码的一部分 for int ix 4 ix lt 1366 ix ix 4 x x 4 for int iy 3 iy lt 768 iy i
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 什么是 __declspec 以及何时需要使用它?

    我见过这样的例子 declspec在我正在阅读的代码中 它是什么 我什么时候需要使用这个构造 这是 Microsoft 对 C 语言的特定扩展 它允许您使用存储类信息来赋予类型或函数属性 文档 declspec C https learn

随机推荐

  • 如何将协议定义为 @ObservedObject 属性的类型?

    我有一个依赖于视图模型的 swiftui 视图 视图模型有一些已发布的属性 我想为视图模型层次结构定义一个协议和默认实现 并使视图依赖于协议而不是具体类 我希望能够写出以下内容 protocol ItemViewModel Observab
  • 导入 .p12 文件中包含的所有证书

    我有一个 p12我的 ASP NET 应用程序通过 HTTPS 连接到 Web 服务的文件 我正在尝试导入 p12文件保存到本地计算机 我的商店中 这 p12 file 包含多个证书 一个包含私钥 另一个是 CA 证书以完成链 目前 我正在
  • Prestashop - 如何写入日志文件?

    我应该在 Prestashop 模块中使用什么 php 代码来写入日志文件 我用过 Logger addLog something 1 但它不起作用 您还可以使用以下代码将日志存储在文件中 logger new FileLogger 0 0
  • HTML5 拖放 拖动时更改图标/光标

    我想知道当我拖动 dragover dragenter 图标 光标时如何更改例如拒绝或允许部分 当然 我可以用光标移动绝对定位的 DOM 部分 但我对原生 HTML5 解决方案感兴趣 Thanks 你在追寻掉落效果 在dragstart中初
  • 按模式递归添加文件

    如何通过位于不同目录中的模式 或全局 递归添加文件 例如 我想添加A B C foo java and D E F bar java 以及其他几个 java 文件 使用一个命令 git add java 不幸的是 这并没有按预期工作 您可以
  • lstat:无法访问另一个目录中的文件

    我正在尝试编写类似 ls 的程序 产生类似的输出ls l包含文件的权限 所有者 时间和名称 如果我通过的话效果很好 或什么都没有 所以它适用于当前目录 但是如果我将任何其他目录传入或传出当前目录 perror说它 无法访问 文件 请帮我找出
  • 使用 XAMPP 启用 SSL

    我一直在尽可能地遵循本指南http robsnotebook com xampp ssl encrypt passwords 然而 每当我浏览到以 https 开头的页面时 apache 服务器都会回复 404 未找到对象 我缺少什么设置
  • Python 3.2:cx_freeze 编译我的程序,但处于调试模式

    我正在使用 Python 3 2 和 Pygame 制作游戏 我已经成功地使用了cx freeze将所有内容捆绑到可执行文件中 然后运行 美好的 唯一的问题是 即使当我通过 OO标记我的setup py 我的游戏是在调试模式下编译的 我已经
  • NHibernate / MySQL 字符串连接

    我有一个 nhibernate linq 查询 如下所示 from b in session Query
  • 如何以编程方式在 Active Directory 中搜索打印机

    尝试使用 C 在 Active Directory 中查找打印机 共享 这是我适用于用户的示例代码 但是我看不到能够找到使用相同概念的打印机 我是 Active Directory 新手 DirectoryEntry entry new D
  • httprouter配置NotFound

    我在用着httprouter对于 API 我正在尝试找出如何处理 404 它确实说在docs404 可以手动处理 但我真的不知道如何编写自己的自定义处理程序 在我的其他路线之后我尝试了以下方法 router NotFound pageNot
  • 在混合 MVC/WebForms Web 应用程序中配置授权

    我目前正在将 WebForms MVP 应用程序的一些组件迁移到 MVC 中 到目前为止 除了授权之外 一切正常 无论如何 当我导航到 MVC 版本的登录页面时 我会被重定向到在Web config
  • Maven 需要为托管依赖项指定插件版本 spring-boot-configuration-processor

    我有一个带有模块的 Maven 项目 我的根项目的父项目是spring boot starter parent 它提供了大量的依赖管理 在我的模块中 我使用spring boot configuration processor 这是由管理的
  • 如何在 JavaScript 中扩展 XMLHttpRequest 对象?

    我想扩展现有的XMLHttpRequest对象 以便它可以与所有浏览器一起使用 现在我已经经历了JS继承然而在开始之前我想看看很好的例子 HTML5 有上传和进度事件的东西 我想在继承的新对象中实现这些东西 即使不支持该功能 也可以通过不向
  • 创建 Java 数组时使用尖括号和方括号方法的区别

    我最近刚刚开始使用 Java 并开始接触数组 据我所知 有两种创建数组的方法 对于有 python 背景的我来说 第一种方法最有意义 type ArrayName i e int agesOfParticipants 然而 许多在线资源使用
  • 保护 PhoneGap 中的敏感信息?

    我有许多想要保护的 REST API 密钥 Google Places 等 阅读 Google Groups 等 似乎混淆不是解决方案 使用钥匙串也不是解决方案 那么当 IPA 包可以解压和读取时 您建议如何加密 保护敏感信息 我不想用 O
  • android-gradle-plugin 1.2.2:标记ignoreFailures导致任务connectedAndroidTest出错

    我更新了我的 build gradle 以使用 android gradle 插件 1 2 2 而不是 1 1 0 dependencies classpath com android tools build gradle 1 2 2 之后
  • 不从 Function App 向 Application Insights 发送数据

    我有 Function App 和 Application Insight 服务 我注意到我的应用程序发送的数据量很大并且产生很大的成本 我可以禁用 完全停止向 AI 发送数据而不删除APPINSIGHTS INSTRUMENTATIONK
  • 使用 javascript / jQuery 更好地实现淡入淡出图像交换

    这不是一个具体的问题或错误 而是一个实施问题 首先我想说 我已经看过很多褪色图像教程 并且对不同类型有基本的了解 我希望这个问题不会与其他数百个有关图像褪色的问题一起被抛弃 这基本上就是我想要的 使用 javascript 最好是 jQue
  • 创建对象:有或没有“new”[重复]

    这个问题在这里已经有答案了 可能的重复 使用 new 实例化对象与不使用 new 实例化对象有什么区别 这可能是一个基本问题 并且可能已经被问过 例如 here 但我还是不明白 那么 让我问一下 考虑以下 C 类 class Obj cha