如何在堆栈和堆对象之间进行转换

2024-01-04

Example:

Class *_obj1;
Class *_obj2;

void doThis(Class *obj) {}

void create() {
    Class *obj1 = new Class();
    Class obj2;

    doThis(obj1);
    doThis(&obj2);

    _obj1 = obj1;
    _obj2 = &obj2;
}

int main (int argc, const char * argv[]) {

    create();

    _obj1->doSomething();
    _obj2->doSomething();

    return 0;
}

这将创建 2 个对象,创建指向它们的指针,然后 main() 对每个对象调用一个方法。 Class 对象创建一个 char* 并存储 C 字符串“Hello!”在里面; ~Class() 释放器释放内存。 doSomething() 方法使用 printf() 打印出“buff: %s”。够简单的。现在,如果我们运行它,我们会得到:

Dealloc
巴夫:您好!
浅黄色: ́_ˇ

显然是栈对象在这里不起作用- 很明显,当函数退出时,指针 _obj2 指向堆栈中的某个位置。这就是为什么我在上一个问题中使用堆对象,人们告诉我这是“愚蠢的”。

所以,第一个问题是:如果如何将堆栈对象 (obj2) 转换为堆对象,以便在 create() 退出后不会释放它?我想要一个直接的答案,而不是像很多人那样傲慢地回答“你做错了”。因为在这种情况下堆栈对象无法工作,所以堆对象似乎是唯一的方法。编辑:此外,转换回堆栈对象也很有用。

第二个问题:堆对象“错误”的具体例子是创建一个新的vector<string>*使用new操作员。如果动态分配STL对象是错误的,那么正确的方法是什么?显然,如果您将它们创建为堆栈对象,则会失败,因为它们会立即被释放,但我被告知(再次,由一位非常高级的成员)动态分配它们可能会损坏堆。那么正确的做法是什么呢?


所以,第一个问题是:如何将堆栈对象(obj2)转换为堆对象,以便在 create() 退出后它不会被释放?我想要一个直接的答案

直接的答案是:您无法在堆栈和堆之间“转换”对象。正如其他人指出的那样,您可以创建存在于另一个空间中的对象的副本,但仅此而已。

第二个问题:堆对象“错误”的具体示例是使用 new 运算符创建一个新的向量*。如果动态分配STL对象是错误的,那么正确的方法是什么?显然,如果您将它们创建为堆栈对象,则会失败,因为它们会立即被释放,但我被告知(再次,由一位非常高级的成员)动态分配它们可能会损坏堆。

动态分配 STL 对象本身不会损坏堆。 (不知道您可能在哪里听说过。)

如果您想在创建它的函数之外使用堆栈分配的 STL 对象,你不能,因为对象所在的堆栈空间仅在创建它的函数内有效。

但是,您可以返回该对象的副本:

std::vector<char> SomeFunc()
{
    std::vector<char> myvector;
    // myvector.operations ...
    return myvector;
}

不过,正如我所说,这将返回对象的副本,而不是原始对象本身 - 这是不可能的,因为包含该对象的堆栈在函数返回后被展开。

另一种选择是让调用者传递指向函数操作的对象的引用/指针(如果这对您的特定场景有意义):

void SomeFunc(std::vector<char>& destination)
{
    // destination.operations ...
}

void AnotherFunc()
{
    std::vector<char> myvector;
    SomeFunc(myvector);
}

正如您所看到的,您仍然分配了堆栈上的所有内容,并且避免了依赖复制构造函数返回对象副本的(有时是间接的)开销。

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

如何在堆栈和堆对象之间进行转换 的相关文章

  • 进程何时获得 SIGABRT(信号 6)?

    C 中进程获得 SIGABRT 的场景有哪些 该信号是否始终来自进程内部 或者该信号可以从一个进程发送到另一个进程吗 有没有办法识别哪个进程正在发送该信号 abort 向调用进程发送SIGABRT信号 就是这样abort 基本上有效 abo
  • 为什么我不能用 `= delete;` 声明纯虚函数?

    Intro 纯虚函数使用通用语法声明 virtual f 0 然而 自 c 11 以来 有一种方法可以显式地传达non existence 特殊 成员函数的 Mystruct delete eg default constructor Q
  • 如何在 Android NDK 中创建新的 NativeWindow 而无需 Android 操作系统源代码?

    我想编译一个 Android OpenGL 控制台应用程序 您可以直接从控制台启动 Android x86 运行 或者从 Android x86 GUI 内的 Android 终端应用程序运行 这个帖子 如何在 Android NDK 中创
  • 为什么要序列化对象需要 Serialized 属性

    根据我的理解 SerializedAttribute 不提供编译时检查 因为它都是在运行时完成的 如果是这样 那么为什么需要将类标记为可序列化呢 难道序列化器不能尝试序列化一个对象然后失败吗 这不就是它现在所做的吗 当某些东西被标记时 它会
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • JSON 数组到 C# 列表

    如何将这个简单的 JSON 字符串反序列化为 C 中的列表 on4ThnU7 n71YZYVKD CVfSpM2W 10kQotV 这样 List
  • 从多个类访问串行端口

    我正在尝试使用串行端口在 arduino 和 C 程序之间进行通信 我对 C 编程有点陌生 该程序有多种用户控制形式 每一个都需要访问串口来发送数据 我需要做的就是从每个类的主窗体中写入串行端口 我了解如何设置和写入串行端口 这是我的 Fo
  • 检查算术运算中的溢出情况[重复]

    这个问题在这里已经有答案了 可能的重复 检测 C C 中整数溢出的最佳方法 https stackoverflow com questions 199333 best way to detect integer overflow in c
  • 当前的 c++ 工作草案与当前标准有何不同

    通过搜索该标准的 PDF 版本 我最终找到了这个链接C 标准措辞草案 http www open std org jtc1 sc22 wg21 docs papers 2012 n3376 pdf从 2011 年开始 我意识到我可以购买最终
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 在非活动联合成员上使用“std::addressof”是否定义明确[重复]

    这个问题在这里已经有答案了 下面的代码是尝试实现constexpr的版本offsetof在 C 11 中 它可以在 gcc 7 2 0 和 clang 5 0 0 中编译 这取决于申请std addressof工会非活跃成员的成员 这是明确
  • 如何在c#中的内部类中访问外部类的变量[重复]

    这个问题在这里已经有答案了 我有两个类 我需要声明两个类共有的变量 如果是嵌套类 我需要访问内部类中的外部类变量 请给我一个更好的方法来在 C 中做到这一点 示例代码 Class A int a Class B Need to access
  • 尚未处理时调用 Form 的 Invoke 时出现 ObjectDisposeException

    我们得到一个ObjectDisposedException从一个电话到Invoke在尚未处理的表格上 这是一些演示该问题的示例代码 public partial class Form2 Form void Form2 Load object
  • 将代码拆分为标头/源文件

    我从 Asio 的示例页面中获取了以下代码 class tcp connection public boost enable shared from this
  • strcmp 给出分段错误[重复]

    这个问题在这里已经有答案了 这是我的代码给出分段错误 include
  • 双精度类型二维多维数组的 pinvoke 编组作为 c# 和 c++ 之间的输入和输出

    我有以下我正在尝试解决的双物质类型的 2d 多维数组的 c 和 c pinvoke 编组 我已经查看了以下热门内容以获得我目前拥有的内容使用双精度数组进行 P Invoke 在 C 和 C 之间编组数据 https stackoverflo
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • Googletest:如何异步运行测试?

    考虑到一个包含数千个测试的大型项目 其中一些测试需要几分钟才能完成 如果按顺序执行 整套测试需要一个多小时才能完成 通过并行执行测试可以减少测试时间 据我所知 没有办法直接从 googletest mock 做到这一点 就像 async选项

随机推荐

  • 每个 url 路由和子路由的 Spring 单页“/a/** => /a/index.html except /a/static/**”

    我正在构建 spring 网站 该网站在子路由下有反应单页应用程序 我当前的 url 结构应该如下所示 localhost admin gt react app localhost gt spring thymeleaf rest webs
  • 如何使用 ImageGrid 将标签添加到颜色条?

    在之前的一个问题中 ImageGrid 中的颜色条标签 matplotlib https stackoverflow com questions 14205547 colobar label matplotlib in imagegrid
  • Ajax 请求包含无效字符

    我创建了一个 AJAX 请求 在新的浏览器中它工作正常 但 IE7 告诉我该行中的字符有错误 其中function gettestvaraibles 站立 有人能告诉我错误可能出在哪里吗 ajax http testurl eID test
  • # -*- 编码:utf-8 -*- 在 python3 上 [重复]

    这个问题在这里已经有答案了 我在 Windows 上使用 Python 3 x 我应该使用 coding utf 8 我的文件上的声明 我读过很多主题 我认为答案是否定的 但我不确定 顺便说一句 我只用英语和意大利语写作 也许你还需要知道一
  • Socket.io Engine.io 问题“?EIO=4&transport=polling&t=OUAHy-a 404”

    当我尝试使用 socket io 将客户端连接到我的网站时 它只是垃圾邮件https example com socket io EIO 4 transport polling t OUAHy a 404 有时请求只是超时而不是 404 在
  • C 风格结构体声明

    我有一个关于 C 风格结构的简单问题 我正在挖掘一些示例代码 发现了一个按以下方式声明的结构 typedef struct STRUCTNAME struct contents STRUCTNAME 请注意 第二次出现 STRUCTNAME
  • TypeScript 在 jquery 函数作用域内调用类上的方法

    我有下面的 TypeScript 类 export class BrandViewModel private items ko observableArray public Add id number name string active
  • 原始查询必须包含主键

    我有一个原始的 SQL 语句views py Message objects raw SELECT s1 ID s1 CHARACTER ID MAX s1 MESSAGE MESSAGE MAX s1 c occurrences FROM
  • 对于这种 PHP 按值调用行为有合理的解释吗?还是 PHP 的 bug?

    PHP 5 5 12 考虑一下
  • 多态模型的骨干集合

    我有一系列动物 App Collections Animals extends Backbone Collection model App Animal url animals returns json 这些动物类别 App Models
  • BinaryWriter 字节序问题

    我正在使用 BinaryWriter 类将二进制文件写入磁盘 当我调用 Write 方法并传递无符号短值时 它会以小端格式写入 例如 bw Write 0xA000 将二进制文件中的值写入为 0x00 0xA0 有没有办法让 BInaryW
  • 如何列出特定 S3 存储桶中的所有文件?

    我在我的项目中使用 AWS S3 存储桶 在其中使用 API 上传图像和列出图像 效果非常好 现在我想列出特定 S3 存储桶 文件夹的所有文件 特定存储桶的对象列表 这是我的 S3 存储桶的屏幕截图 我尝试给存储桶命名 例如 wevieu
  • 以编程方式指定 Django 模型属性

    我想以编程方式向 Django 模型添加属性 在类创建时 定义模型类时 此后模型在运行时不会改变 例如 假设我想定义一个Car模型类并想添加一个price给定货币列表的每种货币的属性 数据库列 这个货币列表应该被认为是一个不会改变运行时间的
  • 无法将 IMAPInputStream 转换为 Multipart

    在Java项目中 我可以从gmail服务器接收邮件 但我想收到身体的包裹部分 在这个代码示例中我的最后一个message messages length 1 是多部分 混合的 调试是通过if块 但它落入 catch 块并给了我以下消息 线程
  • Gradle 中的相对项目依赖关系?

    指定 Gradle 项目依赖项时 我可以避免使用完整的绝对项目名称并使用相对项目名称吗 即在我的示例中 我不想在引用 domain a 时显式指定 app a Directory structure app a domain a build
  • 基于 unquote-splicing 排除多列(!!!)

    试图排除 multiple调用中的列tidyr gather 它们通过a作为我的函数的输入字符向量参数 输出shiny selectInput 而不是通过 in a 程序化的 way 我该如何使用整洁的评估功能来做到这一点 由于我通过单个函
  • gcc:设备上没有剩余空间?

    我试图在 Ubuntu 10 中使用简单的 gcc 命令编写一些 C 代码 但由于某种原因 我不断收到错误 Cannot create temporary file in tmp No space left on device 但问题是 我
  • 将 json 文本作为命令行参数传递

    我正在尝试将以下 JSON 文本传递到我的 python 代码中 platform android version 6 0 1 我的代码如下 import sys import json data json loads sys argv 1
  • 为什么绝对位置元素会根据其父元素的右边界换行?

    为什么绝对定位元素依赖于其父元素进行文本换行 没有position absolute从流中删除一个元素 我正在寻求消除这个界限 这就像一个暗示max width我不想要的 我希望另一个开发人员能够设置这个max width 而不用担心这个任
  • 如何在堆栈和堆对象之间进行转换

    Example Class obj1 Class obj2 void doThis Class obj void create Class obj1 new Class Class obj2 doThis obj1 doThis obj2