首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么iostream在使用vcvarsall.bat编译“Hello”时要求调用异常处理程序?

为什么iostream在使用vcvarsall.bat编译“Hello”时要求调用异常处理程序?
EN

Stack Overflow用户
提问于 2021-04-23 14:33:36
回答 2查看 366关注 0票数 0

试图在命令行中使用vcvarsall.bat编译以下代码时,会抛出一个警告,说明代码中需要异常处理程序,但在使用/EHsc之前不需要调用异常处理程序。

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <iostream>

int main()
{
    std::cout << "hello world" << std::endl;
    
    return 0;
}

批处理文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@echo off

cl C:\Development\..\basicmath.cpp

警告:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
C:\...\ostream(746): warning C4530: C++ exception handler used, but unwind semantics are not enabled. Specify /EHsc
C:...\basicmath.cpp(10): note: see reference to function template instantiation 'std::basic_ostream<char,std::char_traits<char>> &std::operator <<<std::char_traits<char>>(std::basic_ostream<char,std::char_traits<char>> &,const char *)' being compiled

ostream第746行(来自错误)的第743 - 754行是_TRY:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (!_Ok) {
        _State |= ios_base::badbit;
    } else { // state okay, insert
        _TRY_IO_BEGIN
        if ((_Ostr.flags() & ios_base::adjustfield) != ios_base::left) {
            for (; 0 < _Pad; --_Pad) { // pad on left
                if (_Traits::eq_int_type(_Traits::eof(), _Ostr.rdbuf()->sputc(_Ostr.fill()))) {
                    _State |= ios_base::badbit; // insertion failed, quit
                    break;
                }
            }
        }

将/EHsc添加到我的批处理文件中将允许它运行,但我想知道为什么会这样。为什么输出文件中的这段代码需要调用EHsc?

MSDOCS说,EHsc是为了防止内存泄漏,是什么导致泄漏,为什么他们需要一个外部程序来修复泄漏,而不是在同一个文件中修复它(这听起来可能很粗鲁,但它只是无知)?

编辑:谢谢你指出这是一个警告,而不是错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-23 15:36:08

简短答覆:

/EHs/EHsc添加到您的编译选项中,正如文献资料建议的那样。如果您需要在Unix机器上执行相同的代码,这是关于异常处理的最可移植的选项。

较长的答覆:

这个问题有两部分。第一个是为什么警告发生在iostream中,第二个是警告意味着什么。

为什么在iostream**?**中有例外

C++中流的默认行为是无例外的--任何故障都是通过设置内部故障位来表示的,可以通过eof()fail()bad()函数访问。但是,可以通过在流上使用exceptions()方法将此行为更改为在失败时抛出异常。您可以选择哪些失败位触发异常,但重点是代码必须按照标准在那里。该警告似乎只分析-它注意到一个可能的路径发生throw并报告警告。

这个警告是什么意思?

来自Microsoft文档 (重点雷):

默认情况下(也就是说,如果没有指定/EHsc/EHs/EHa选项),编译器将在本机C++ catch(...)子句中支持SEH处理程序。然而,也生成只部分支持C++异常的代码。默认异常展开代码不会破坏由于异常而超出作用域的try块之外的自动C++对象。

问题是(由于某种原因) MSVC编译器默认生成程序集,这是错误的标准。当抛出异常时,堆栈展开将不会完成,这可能会导致内存泄漏和其他意外行为。

一个正确的C++代码示例,该代码在默认设置下存在内存泄漏:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void foo()
{
    std::string str = "This is a very long string. It definitely doesn't use Small String Optimization and it must be allocated on the heap."
    std::cout << str;
    throw std::runtime_error{"Oh no, something went wrong"};
}

int main()
{
    try
    {
        foo();
    }
    catch (std::exception&)
    {
        // str in foo() was possibly not released, because it wasn't deleted when exception was thrown!
    }
}

所以最后的答案是:

  • 如果计划使用结构化异常 (如除以零或无效内存访问错误)或使用使用这些错误的库,请使用/EHa
  • 如果不需要捕获SE,请选择/EHs以确保与C++标准的兼容性和可移植性。
  • 永远不要离开默认值,始终将/EH设置为一种或另一种选择,否则在使用异常时将不得不处理奇怪的行为。
票数 1
EN

Stack Overflow用户

发布于 2021-04-23 15:36:31

这是一个警告,所以您的当前程序编译良好。但是,在这样的项目中出现了一些问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <exception>
#include <iostream>

struct A{
    A(int x):x(x) {
        std::cout<<"Contructed A::"<<x<<'\n';
    }
    ~A() {
        std::cout<<"Destructed A::"<<x<<'\n';
    }
private:
    int x;
};


void foo() {
    A a{2};
    throw std::bad_exception{};
}

int main()
{
    A a {1};
    try {
        foo();
    } catch(const std::bad_exception& ex) {
        std::cout<<ex.what()<<'\n';
    }
    
    return 0;
}

使用cl test.cpp生成输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Contructed A::1
Contructed A::2
bad exception
Destructed A::1

在使用cl test.cpp /EHsc时,产量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Contructed A::1
Contructed A::2
Destructed A::2
bad exception
Destructed A::1

此行为由警告C4530的文档解释。

当未启用/EHsc选项时,抛出函数与捕获异常的函数之间的堆栈帧中的自动存储对象不会被破坏。只有在try或catch块中创建的自动存储对象才会被销毁,这会导致严重的资源泄漏和其他意外行为。

这就解释了为什么当程序没有用/EHsc编译时,/EHsc没有被破坏。

当然,

如果在可执行文件中不可能引发异常,则可以安全地忽略此警告。

所以,对于像这样的程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <cstdio>

int main()
{
    std::printf("hello world\n");
    
    return 0;
}

cl.exe悄悄地编译。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67237550

复制
相关文章
jupyter中运行pyspark
Python for Spark显然比Scala慢。然而,易于学习,并且受益于我最喜爱的库。在我看来,Python是大数据/机器学习领域中原型设计的完美语言。
Tim在路上
2020/08/04
2.4K0
spark编程python实例
本文介绍如何使用 PySpark 来读取和分析 CSV 数据。首先,我们介绍在 PySpark 中创建 SparkContext 的步骤,然后使用 SparkContext 来读取和分析 CSV 数据。我们使用 map 函数对数据进行处理,并使用 count 函数获取数据中的总购买次数。最后,我们打印出总购买次数。
王小雷
2018/01/02
1.7K0
spark编程python实例
Pyspark学习笔记(三)--- SparkContext 与 SparkSession
__SparkContext__是spark功能的主要入口。 其代表与spark集群的连接,能够用来在集群上创建RDD、累加器、广播变量。 每个JVM里只能存在一个处于激活状态的SparkContext,在创建新的SparkContext之前必须调用stop()来关闭之前的SparkContext.
TeeyoHuang
2021/05/10
3.7K0
Pyspark学习笔记(三)--- SparkContext 与 SparkSession
pyspark on hpc
本地内部集群资源有限,简单的数据处理跑了3天。HPC上有很多计算资源,出于先吃锅里的再吃碗里的思想,琢磨先充分利用共有资源。简单调研下,也不是很复杂的事情。
flavorfan
2021/12/10
1.7K0
pyspark on hpc
第2天:核心概念之SparkContext
SparkContext是所有Spark功能的入口。无论我们希望运行什么样的Spark应用,都需要初始化SparkContext来驱动程序执行,从而将任务分配至Spark的工作节点中执行。
会呼吸的Coder
2021/03/16
1.1K0
第2天:核心概念之SparkContext
大数据入门与实战-PySpark的使用教程
Apache Spark是用Scala编程语言编写的。为了用Spark支持Python,Apache Spark社区发布了一个工具PySpark。使用PySpark,您也可以使用Python编程语言处理RDD。正是由于一个名为Py4j的库,他们才能实现这一目标。 这里不介绍PySpark的环境设置,主要介绍一些实例,以便快速上手。
致Great
2019/03/19
4.1K0
大数据入门与实战-PySpark的使用教程
Eat pyspark 1st day | 快速搭建你的Spark开发环境
下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
超哥的杂货铺
2021/04/08
2.4K0
Eat pyspark 1st day | 快速搭建你的Spark开发环境
金色传说,开源教程!属于算法的大数据工具-pyspark
spark是目前大数据领域的核心技术栈,许多从事数据相关工作的小伙伴都想驯服它,变成"驯龙高手",以便能够驾驭成百上千台机器组成的集群之龙来驰骋于大数据之海。
Sam Gor
2021/01/18
1.2K0
金色传说,开源教程!属于算法的大数据工具-pyspark
Python大数据之PySpark(三)使用Python语言开发Spark程序代码
需求:[(‘Spark’, 2), (‘Flink’, 1), (‘hello’, 3), (‘you’, 1), (‘me’, 1), (‘she’, 1)]
Maynor
2023/09/29
5620
Python大数据之PySpark(三)使用Python语言开发Spark程序代码
Spark Streaming 2.2.0 初始化StreamingContext
为了初始化 Spark Streaming 程序,必须创建一个 StreamingContext 对象,它是 Spark Streaming 所有流操作的主要入口。StreamingContext 对象可以用 SparkConf 对象创建。
smartsi
2019/08/07
1.4K0
Python大数据之PySpark(五)RDD详解
rdd2=sc.textFile(“hdfs://node1:9820/pydata”)
Maynor
2023/10/04
6920
Python大数据之PySpark(五)RDD详解
Spark-Core核心RDD基础
spark中的RDD是一个核心概念,RDD是一种弹性分布式数据集,spark计算操作都是基于RDD进行的,本文介绍RDD的基本操作。
软件架构师Michael
2022/05/05
2880
PySpark——开启大数据分析师之路
近日由于工作需要,突击学了一下PySpark的简单应用。现分享其安装搭建过程和简单功能介绍。
luanhz
2020/09/08
2.1K0
PySpark——开启大数据分析师之路
Spark笔记15-Spark数据源及操作
数据输入源 Spark Streaming中的数据来源主要是 系统文件源 套接字流 RDD对列流 高级数据源Kafka 文件流 交互式环境下执行 # 创建文件存放的目录 cd /usr/loca/spark/mycode mkdir streaming cd streaming mkdir logfile cd logfile # 对这个子目录进行数据监控 from pyspark import SparkContext from pyspark.streaming import StreamingCo
皮大大
2021/03/02
8000
PySpark工作原理
Spark是一个开源的通用分布式计算框架,支持海量离线数据处理、实时计算、机器学习、图计算,结合大数据场景,在各个领域都有广泛的应用。Spark支持多种开发语言,包括Python、Java、Scala、R,上手容易。其中,Python因为入门简单、开发效率高(人生苦短,我用Python),广受大数据工程师喜欢,本文主要探讨Pyspark的工作原理。
Fayson
2020/02/18
2.3K0
PySpark工作原理
流数据_数据回流是什么意思
https://www.liaoxuefeng.com/wiki/897692888725344/923030465280480
全栈程序员站长
2022/09/20
1.2K0
流数据_数据回流是什么意思
【Python】PySpark 数据输入 ① ( RDD 简介 | RDD 中的数据存储与计算 | Python 容器数据转 RDD 对象 | 文件文件转 RDD 对象 )
RDD 英文全称为 " Resilient Distributed Datasets " , 对应中文名称 是 " 弹性分布式数据集 " ;
韩曙亮
2023/10/11
5010
【Python】PySpark 数据输入 ① ( RDD 简介 | RDD 中的数据存储与计算 | Python 容器数据转 RDD 对象 | 文件文件转 RDD 对象 )
pyspark streaming简介 和 消费 kafka示例
/spark/examples/src/main/python/streaming
编程黑洞
2023/03/06
1.1K0
pyspark streaming简介 和 消费 kafka示例
Windows 安装配置 PySpark 开发环境(详细步骤+原理分析)
这个比较简单,安装原生的 Python 或者 Anaconda 都可以,至于步骤这里就不多说了。
bboy枫亭
2020/09/22
15.8K0
Windows 安装配置 PySpark 开发环境(详细步骤+原理分析)
pyspark 原理、源码解析与优劣势分析(1) ---- 架构与java接口
Spark 框架主要是由 Scala 语言实现,同时也包含少量 Java 代码。Spark 面向用户的编程接口,也是 Scala。然而,在数据科学领域,Python 一直占据比较重要的地位,仍然有大量的数据工程师在使用各类 Python 数据处理和科学计算的库,例如 numpy、Pandas、scikit-learn 等。同时,Python 语言的入门门槛也显著低于 Scala。为此,Spark 推出了 PySpark,在 Spark 框架上提供一套 Python 的接口,方便广大数据科学家使用。本文主要从源码实现层面解析 PySpark 的实现原理,包括以下几个方面:
流川疯
2021/12/06
1.2K0
pyspark 原理、源码解析与优劣势分析(1) ---- 架构与java接口

相似问题

WHERE IN ($array) AND $array =?

20

Laravel: where语句与关系

245

与where子句的雄辩关系

12

Laravel与附加where语句的关系

12

基于与Laravel关系的where应用

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文