auto_ptr问题
head.h:
#include <memory>
class X{
public:
class Y{};
std::auto_ptr<Y> py;
};
---------------------------------------------------
a.cpp:
#include "head.h"
int main(int argc, char *argv[]){
X x;
return 0;
}
---------------------------------------------------
b.cpp(此时就相当为空,仅仅#include一个头文件而已):
#include "head.h"
---------------------------------------------------
此时编译成功。
现在作修改,将head.h中class Y的定义转移到b.cpp中:
---------------------------------------------------
head.h:
#include <memory>
class X{
public:
class Y;
std::auto_ptr<Y> py;
};
---------------------------------------------------
a.cpp:
#include "head.h"
int main(int argc, char *argv[]){
X x;
return 0;
}
---------------------------------------------------
b.cpp(此时就相当为空,仅仅#include一个头文件而已):
#include "head.h"
class X::Y{
};
---------------------------------------------------
此时编译就有问题了:在vs中是一个警告,而在g++中则是error。
大家不要错误地认为是由于“std::auto_ptr<Y> py;需要class Y的定义”而导致的错误(可能在vc6中是这么要求的,但是标准并没有这方面的强制要求)。这其实是more exceptional c++ 条款30,185页的一个问题,结合书上的解释,我的理解是:因为在a.cpp的main函数中有“X x;”,所以在main函数的结尾编译器会自动安插一个“x.~x();”(即调用x对象的析构函数),而编译器为class X自动合成的析构函数中肯定会有类似“py.~auto_ptr<Y>();”之类的语句来调用数据成员的析构函数,并且由于编译器为class X自动合成的析构函数很小,所以编译器会将它设置为inline,这样一来“py.~auto_ptr<Y>();”就出现在main函数中了,这也就要求在a.cpp中将会有auto_ptr<Y>::~auto_ptr<Y>的实例化点,而在auto_ptr<Y>::~auto_ptr<Y>的实例化点肯定需要用到class Y的定义,但是在a.cpp中没有class Y的定义,所以出现错误。
more exceptional c++中提供的解决方案(当然不是“在头文件中提供class Y的定义”了)是(185页):如果你不想提供Y的定义,就必须显式地写出X的析构函数,即使函数体为空。
但是这个方法并不好用,即使显式提供X的析构函数,编译仍然有问题(你可以试一试)。后来我想了一下,就算我们显式提供了X的析构函数,编译器仍然会在析构函数体中安插“调用数据成员析构函数”的代码,即X的析构函数中仍然会存在类似“py.~auto_ptr<Y>();”之类的语句,所以问题依然存在。
不知道我分析得对不对,望高手指教。
相关推荐
PySpark数据处理技术大全
PySpark 是 Spark 的 Python API,提供了类似于 Spark Core、Spark SQL、Spark Streaming、MLlib 和 GraphX 等组件的接口。这些组件支持分布式计算、实时计算、流式计算、机器学习和图计算等功能。PySpark 特别适合处理大规模数据集,并且能够与其他 Python 库如 NumPy 和 Pandas 集成,使得数据处理和分析更加灵活和高效。
Python大数据处理库 PySpark实战
Python大数据处理库 PySpark实战PPT课件
Python大数据处理库PySpark实战——使用PySpark处理文本多分类问题
【导读】我们知道,ApacheSpark在处理实时数据方面的能力非常出色,目前也在工业界广泛使用。本文通过使用SparkMachineLearningLibrary和PySpark来解决一个文本多分类问题,内容包括:数据提取、ModelPipeline、训练/测试数据集划分、模型训练和评价等,具体细节可以参考下面全文。ApacheSpark受到越来越多的关注,主要是因为它处理实时数据的能力。每天都有大量的数据需要被处理,如何实时地分析这些数据变得极其重要。另外,ApacheSpark可以再不采样的情况下快速处理大量的数据。许多工业界的专家提供了理由:whyyoushoulduseSparkfo
case_pyspark:基于Python语言的Spark数据处理分析案例集锦(PySpark)
case_pyspark 基于Python语言的Spark数据处理分析案例集锦(PySpark) 实验环境 1) Linux: Ubuntu 20.04 2) Python: 3.7.x 3) Spark: 2.4.5(安装教程: 4) Jupyter Notebook: (安装教程和使用方法: 案例 1) yelp: 基于YELP数据集的商业数据分析 2) us_counties: 2020年美国新冠肺炎疫情数据分析 3) ECommerce: 基于零售交易数据的Spark数据处理与分析 4) earthquake: 基于地震数据的Spark数据处理与分析 5) global: 基于Spark的地震数据处理与分析 6) OverDue: 基于信用卡逾期数据的Spark数据处理与分析 7) project: 基于 TMDB 数据集的电影数据分析
Python大数据处理库 PySpark实战-源代码.rar
Python大数据处理库 PySpark实战-源代码


