联合中的字符串、段错误

2024-01-07

这基本上是一个标记联合:

#include <string>
using std::string;

struct test{
    test():tag(INT),i(0){};
    test(const test&)=delete;
    test& operator=(const test&)=delete;
    enum {STRING,INT} tag;
    union {
        string s;
        int i;
    };
    test& operator=(string s){
        this->s=s;
        tag=STRING;
        return *this;
    }
    test& operator=(int i){
        this->i=i;
        tag=INT;
        return *this;
    }
    ~test(){
        if (tag==STRING)
            s.~string();
    }
};

int main(){
    test instance;
    instance="string";
    return 0;
}

它可以编译,但每次都会因分段错误而崩溃。我只是出于好奇,它是一个非常完整的联合类,提供了自定义析构函数,没有移动也没有复制,那么为什么会崩溃呢?我必须使用string*在工会?如果是这样,为什么?


仔细阅读有关五法则 https://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29在 C++11 中

这是错误的代码:

 /// wrong code
  test& operator=(string s){
      this->s=s;
      tag=STRING;
      return *this;
  }

因为你错误地认为this->s在分配之前有效。你应该使用安置新 http://en.cppreference.com/w/cpp/memory/new/operator_new which 结构体它(在一个未初始化的内存区域起始于&this->s):

  test& operator=(string ss){
      if (tag==STRING) { s=ss; return *this; }
      new((void*)&s) std::string(ss);
      tag=STRING;
      return *this;
  }

顺便说一句,我想你也应该明确define

test(const test&s);
test(const std::string&);
test& operator=(const test&);
test(test&&s);
test& operator=(test&&);

顺便说一句,你显然缺少构造函数:

test(const std::string&str) {
  tag = STRING;
  new ((void*)(&s)) std::string(str);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

联合中的字符串、段错误 的相关文章

随机推荐

  • 如何使用CSS 3d矩阵创建弯曲变形效果

    我正在尝试使用 css3 在 ios 中复制吸吮效果 webkit transform matrix3d 财产 但是 我无法像图片中那样管理弯曲边缘 我自己最接近的解决方案如下 webkit transform matrix3d 0 85
  • 面临 XLWT 和 XLRD 的问题 - 同时读写

    我面临 xlrd 和 xlwt 的问题 粘贴示例代码 以下 from xlwt import Workbook Formula XFStyle import xlrd book Workbook sheet1 book add sheet
  • Whatsapp 如何在 iOS 中更快地从地址簿中获取更新的联系人?

    我的发现 我正在设计一个逻辑来与我的后端同步联系人 我浏览了一些在 IOS 中做同样事情的应用程序 我将以 WhatsApp 为例 我发现当我更新 Native Addressbook 中的任何联系人时 它会以一小部分反映到 Whatsap
  • 确定数组的一半以上是否在不同数组中重复

    我正在看以下内容来自 Glassdoor 的问题 http www glassdoor com Interview Given N credits cards determine if more than half of them belo
  • C 中指向指针的问题

    我试图用 C 语言编写某种列表 而不为列表的头部创建全局变量 但我遇到了一些麻烦 我最初的代码是这样的 include
  • eclipse java代码显示行号

    我需要在 eclipse 上安装哪些插件才能使 java 文件显示行号 在 xml html 上显示行号怎么样 还有一种更简单的方法 只需右键单击装订线 代码所在的编辑器窗口的左边框 并启用它们 那里有一个特定的选项
  • 是否可以在 update_item 中结合 if_not_exists 和 list_append

    我正在尝试使用update itemboto3 中 DynamoDB 的功能 我现在正在努力更新项目列表 如果列表尚不存在 我想创建一个新列表 否则附加到现有列表 使用UpdateExpression形式的SET my list list
  • 限制列只接受 2 个值

    我的表中有一个名为 患者类型 的列 我想确保只有 2 个值可以插入到该列中 无论是 opd 还是 recognize 除此之外 所有其他输入都无效 下面是我想要的一个例子 如何确保该列仅接受 opd 或 admissed 作为 患者类型 列
  • MS Sql 服务器中的累计总数[重复]

    这个问题在这里已经有答案了 可能的重复 在 Sql Server 中计算运行总计 https stackoverflow com questions 860966 calculate a running total in sqlserver
  • 将 geom_boxplot 与 geom_line 结合起来

    我想使用组合箱线图和线图ggplot2 然而 我正在努力为每个组安排线路 g 连接 x 轴上类别的点 为了演示这个问题 df lt data frame x rep letters 1 3 each 5 y c 1 5 sample 10
  • 谷歌浏览器中的 ReportViewer 问题

    我在我的 asp net mvc C 应用程序中使用 Reportviewer 在 IE 和 Firefox 中 报表查看器看起来不错 但在 Chrome 中 标题和正文会缩小 我能够按照中的建议纠正标题显示问题http www mazso
  • 如何在不刷新的情况下更新页面

    在Gmail中 当收到新邮件时 页面会自动显示该邮件而不刷新 这是怎么做到的 您可以使用以下命令定期发送 AJAX 请求window setInterval http developer mozilla org en DOM window
  • 如何在 Symfony 2 / Doctrine 中启用 ENUM

    跑步时doctrine mapping import我收到错误 请求未知的数据库类型枚举 Doctrine DBAL Platforms MySqlPlatform 可能不支持它 看来我需要设置use native enum to true
  • TamperMonkey 中的 GM_addStyle 等效项

    是否有与 GreaseMonkey 相当的 TamperMonkeyGM addStyle添加CSS的方法 在 GreaseMonkey 中 您可以向多个元素添加一堆 CSS 属性 如下所示 GM addStyle body color w
  • Node.js 中确定一个路径是否是另一个路径的子目录

    我正在研究一个MQTT 处理程序 https github com jsdario replyer我想为每个有事件侦听器的父目录发出一个事件 例如 如果有以下可用的 MQTT 路径 其中有下标 这些路径有事件监听器 test replyer
  • 与大括号初始化末尾的额外“,”有任何关联吗?

    除了明显的名称之外 以下两个声明之间是否有区别 int main char str1 17 H e l l o char str2 17 H e l l o 第二个中多余的 是怎么回事 这有什么意义吗 两者似乎都编译得很好 在这种情况下 它
  • 我可以在 Django 中使用数据库视图作为模型吗?

    我想使用在数据库中创建的视图作为 django view 的源 不使用自定义sql 这可能吗 13 02 09 更新 就像许多答案所建议的那样 您可以在数据库中创建自己的视图 然后通过在 models py 中定义它来在 API 中使用它
  • 单字节异或密码 (python)

    这是我目前正在学习的现代密码学课程 挑战是 cryptopals 挑战 3 单字节 XOR 密码 我正在尝试使用 python 3 来帮助完成此任务 我知道我应该对字符串进行异或并转换为英语 十六进制字符串为 1b37373331363f7
  • ImageMagick - 与其他照片管理应用程序一样自动调整图像的颜色?

    一些照片管理应用程序 例如 flickr 网站上的 Picnic gnome 桌面上的 F Spot 可以选择 自动更正 自动修复 图像 这似乎可以调整图像中的颜色以使其看起来更美观好一些 例如 这是之前的 and after 无论如何 是
  • 联合中的字符串、段错误

    这基本上是一个标记联合 include