C++编译器VS2019和MinGW的问题

2023-05-16

C++编译器VS2019和MinGW的问题:

最近在啃C++ Primer这本书,在学习到第14章重载运算符时,准备为自定义的类String重载一个输入运算符>>,代码如下所示:

//String.h头文件
#ifndef CPPLEARNING_STRING_H
#define CPPLEARNING_STRING_H

#include <memory>
#include <iostream>

class String {
    friend std::ostream& operator<<(std::ostream& os,const String& s);
    friend std::istream& operator>>(std::istream& is,String& s);
    friend bool operator==(String a,String b);
    friend bool operator!=(String a,String b);
public:
    String():begin(nullptr),end(nullptr){}
    String(const char* s);
    String(const String& s);
    //移动构造函数
    String(String &&s) noexcept;

    String& operator=(const String& s);
    //移动赋值运算符
    String& operator=(String &&s) noexcept;
    void free();
    const char* c_str() { return begin; }
    size_t size() { return end - begin; }
    size_t length() { return end - begin - 1; }
private:
    char *begin;
    char *end;
    std::allocator<char> alloc;

private:
    std::pair<char*, char*> alloc_n_copy (const char* beg, const char* end);
    void range_initial(const char* first, const char* last);
};

std::ostream& operator<<(std::ostream& os,const String& s);
std::istream& operator>>(std::istream& is,String& s);
bool operator==(String a, String b);
bool operator!=(String a, String b);


#endif //CPPLEARNING_STRING_H

//String.cpp头文件
#include "String.h"
#include <cstring>
#include <iostream>
#include <utility>
using namespace std;

std::pair<char *, char *> String::alloc_n_copy(const char *beg, const char *end) {
    auto data = alloc.allocate(end-beg);
    return {data, uninitialized_copy(beg,end,data)};
}

void String::range_initial(const char *first, const char *last) {
    auto newStr = alloc_n_copy(first,last);
    begin = newStr.first;
    end = newStr.second;
}

String::String(const char *s) {
    range_initial(s,s+ strlen(s));
}

String::String(const String &s) {
    range_initial(s.begin,s.end);
    //cout<<"copy constructor\n";
}

void String::free() {
    if(begin){
        for(auto i = begin;i!=end;i++){
            alloc.destroy(i);
        }
        alloc.deallocate(begin,end-begin);
    }
}

String &String::operator=(const String &s) {
    auto new_s = alloc_n_copy(s.begin,s.end);
    free();
    begin = new_s.first;
    end = new_s.second;

   // cout<<"copy-assignment operator"<<endl;
    return *this;
}

String::String(String &&s) noexcept:begin(s.begin),end(s.end) {
    s.begin = s.end = nullptr;
    //cout<<"move constructor\n";
}

String &String::operator=(String &&s)  noexcept {
    if(this!=&s){
        free();
        begin = s.begin;
        end = s.end;
        s.begin = s.end = nullptr;
    }
    cout<<"move-assignment operator"<<endl;
    return *this;
}

std::ostream& operator<<(std::ostream& os,const String& s){
    auto c = s.begin;
    while(c!=s.end){
        os<<*c++;
    }
    return os;
}

std::istream& operator>>(std::istream& is,String& s){
    if(!s.begin){
        s = ""; //移动构造函数
    }
    auto c = s.begin;
    char i;
    while(is.get(i)){
        if(i=='\n') break;
        *c++ = i;
    }
    s.end = c;
    return is;
}

bool operator==(String a, String b){
    if(a.size()==b.size()){
        auto c1 = a.begin,c2 = b.begin;
        while(c1!=a.end){
            if(*c1!=*c2){
                return false;
            }
            c1++;c2++;
        }
    }
    return true;
}

bool operator!=(String a,String b){
    return !(std::move(a)==std::move(b));
}

关键代码就在于重载之后的>>运算符,我的策略是一次输入一个字符然后修改String引用类型对应的begin和end指针。运行如下的代码进行测试:

int main() {
    String str;
    cin>>str;
    cout<<str;
}

在MinGW编译器编译后,代码的运行结果如下所示:
MinGW编译运行结果

而使用VS2019编译器编译,代码则出现bug:
在这里插入图片描述
请问有无Cpp大佬能够解答这是什么原因,我其中使用了哪些未定义的操作?

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

C++编译器VS2019和MinGW的问题 的相关文章

  • [CSS] CSS display:flex实现内容水平垂直居中展示

    display flex实现内容水平垂直居中展示 需要增加下面两点就能实现 首先父级元素必须有高度 xff0c 没有高度就无法垂直居中 xff0c 如果想全屏垂直居中 xff0c 可以设置高度为100vh 比如body设置为这样 body
  • Java在字符串中查找匹配的子字符串

    示例 xff1a 在源字符串 You may be out of my sight but never out of my mind 中查找 my 的个数 输出 xff1a 匹配个数为2 三种方法 xff1a 1 通过String的inde
  • Ext4 vs XFS——你应该使用哪个文件系统

    运行 Linux 系统的用户几乎不会关注底层文件系统 事实上 xff0c 在安装 Linux 的过程中 xff0c 通常倾向于使用列出的默认文件系统而不探索其他可用选项 对于 Windows xff0c 事情要容易得多 xff0c 因为 N
  • Btrfs 与 Ext4 - 功能、优势和劣势

    文件系统控制从存储设备存储和检索数据的位置 方式和时间 日常系统进程需要一个高效的文件系统 Linux 内核支持多种文件系统 最常用的是 Ext4 Btrfs XFS 和 ZFS xff0c 这是 2018 年发布的最新文件系统 这些文件系
  • Extjs6 Tree 树数据筛选

    前端使用ExtJS6 xff0c 要求在菜单树上对菜单树的数据进行筛选 xff0c 提高用户的体验 现在功能已经完成 xff0c 这里记录下来便于后面遇到类似问题作为参考 xff0c 会贴上源码和官方Demo提供参考的源码 对Tree的筛选
  • apt update和apt upgrade命令 - 有什么区别?

    在之前的文章中 xff0c 我们查看了APT 命令以及您可以使用包管理器来管理包的各种方法 这是一个总体概述 xff0c 但在本指南中 xff0c 我们暂停并重点关注 2 个命令用法 这些是apt update和apt upgrade命令
  • 48 个 Linux 面试问题和答案

    你在准备 Linux 面试吗 xff1f 我们准备了一些常见的 Linux 面试问题及其答案 如果您是初学者 xff08 具有一定的 Linux 知识或获得认证 xff09 或具有专业的 Linux 管理经验 xff0c 那么下面的问答有助
  • 70 个 Shell 脚本面试问题和答案

    我们为您的面试准备选择了预期的 70 个 shell 脚本问题和答案 对于所有系统管理员来说 xff0c 了解脚本或至少基础知识真的很重要 xff0c 这反过来有助于在您的工作环境中自动执行许多任务 在过去的几年里 xff0c 我们已经看到
  • 如何使用命令行检查 KylinOS-Desktop 版本

    在本指南中 xff0c 我们将向您展示如何轻松检查系统上的KylinOS Desktop 版本 有两种主要方法可以实现这一目标 使用终端 使用图形用户界面 因此 xff0c 让我们深入了解如何使用上述方法来检查系统上的 KylinOS De
  • Linux 中的 20 大网络监控工具

    在本教程中 xff0c 让我们讨论可用于 linux 系统的最佳网络监控工具 有很多可用的工具 xff0c 如 nethogs ntopng nload iftop iptraf bmon slurm tcptrack cbm netwat
  • 将KylinOS-desktop的英文语言环境切换为中文的3种方式

    如果你在英语环境下安装了系统 那么默认语言可能会被设置为英语 所以你最好知道你的安装器使用的是什么语言 如果对语言有要求而又设置错误了 你可以自己进行修改 strong locale strong 命令显示当前配置 locale 命令会列出
  • 如何在 Ubuntu 22.04 上安装 最新版本Wine

    过渡到 Linux 的用户的担忧之一是他们是否可以在 Linux 上运行自己喜欢的应用程序 这些范围可以从 Windows 游戏和简单的应用程序软件 值得庆幸的是 Wine 允许用户在 Linux Unix 系统上运行和执行 Windows
  • 内网搭建Ubuntu(银河麒麟)的apt本地源服务器

    很多项目要求内网环境 导致服务器不能使用公网的apt源 所以需要在内网中搭建一个本地的apt源 本教程将指导你如何利用apt mirror建立局域网内的Debian Ubuntu源镜像 如果你需要在局域网内安装多套系统 那么建立一个本地的D
  • linux分区parted工具的用法详解

    一 概述 通常我们用的比较多的分区工具是fdisk命令 xff0c 但由于fdisk只支持MBR分区 xff0c MBR分区表最大支撑2T的磁盘 xff0c 所以无法划分大于2T的分区 而parted工具可以划分单个分区大于2T的GPT格式
  • Kylin-Desktop 提示sudo: /usr/bin/sudo 必须属于用户 ID 0(的用户)并且设置 setuid 位

    问题 sudo usr bin sudo 必须属于用户 ID 0 的用户 并且设置 setuid 位 解决方案 经过原因排查是 usr bin的权限修改了 使用了命令 sudo chmod R 777 nbsp usr bin 导致 需要将
  • Extjs6 下 动态生成grid表头

    前端使用Extjs6j技术 遇到动态生成gird的需求 这里记录下 xff0c 便于以后使用 首先定义表格 xtype 39 grid 39 region 39 center 39 reference 39 salaryGrid 39 co
  • Git Clone错误解决【GnuTLS recv error (-110): The TLS connection was non-properly terminated.】

    报错信息如下 xff1a Cloning into 39 gramine 39 fatal unable to access 39 https github com gramineproject gramine git 39 GnuTLS
  • redhat 5.4下设置回收站简介

    1 简介 使用rm rf时有时会误删数据 xff0c 可以在系统中添加一个回收站 xff0c 防止误删数据完全找不到 2 方式 在 下 bashrc或者 bash profile加入 mkdir p trash alias rm 61 tr
  • 在CentOS 6.6 64bit上编译安装LLVM3.7,Clang,Libc++和libc++abi

    一 简介 LLVM LLVM xff08 之前称为低级虚拟机Low Level Virtual Machine xff09 是一种非常强大的编译器基础架构框架 xff0c 专门为使用您喜爱的编程语言编写的程序的编译时 链接时和运行时优化而设
  • 免费,好用的天气预报API

    不多说直接上 xff01 一 API服务 xff0c 天气API 网站 xff1a http api help bj cn api 怎么使用网站有很详细的解释 ajax type 34 GET 34 请求方式 url 34 http api

随机推荐