显式调用构造函数和析构函数

2023-10-28

今天跟同事聊天,他说到STL源码有用到显示调用析构函数。试一了一下。果然能行。

#include  < iostream >
using namespace  std;

class  MyClass
{
public :
MyClass()
{
cout 
<< " Constructors " <<  endl;
}
~ MyClass()
{
cout 
<< " Destructors " <<  endl;
}

};

int  _tmain( int  argc, _TCHAR *  argv[])
{
MyClass
*  pMyClass  = new  MyClass;
pMyClass
->~ MyClass();
delete pMyClass;

}

 

 

 

结果:

Constructors

Destructors        //这个是显示调用的析构函数

Destructors        // 这个是delete调用的析构函数

 

这有什么用? 

有时候,在对象的生命周期结束前,想先结束这个对象的时候就会派上用场了。

 

由此想到的: 

因为我知道。

new的时候,其实做了两件事,一是:调用malloc分配所需内存,二是:调用构造函数。

delete的时候,也是做了两件事,一是:调用析造函数,二是:调用free释放内存。

 

所以推测构造函数也是可以显式调用的。做了个实验。

 

int  _tmain( int  argc, _TCHAR *  argv[])
{
MyClass
*  pMyClass  =  (MyClass * )malloc( sizeof (MyClass));
pMyClass
-> MyClass();
//  …
}

 

 

编译pMyClass->MyClass()出错:

error C2273: 'function-style cast' : illegal as right side of '->'operator

天啊,它以为MyClass是这个类型。

 

解决办法有两个:

 

第一:pMyClass -> MyClass::MyClass();
第二:
new (pMyClass)MyClass();

 

 

第二种用法涉及C++ placement new 的用法。

placement new的作用就是:创建对象(调用该类的构造函数)但是不分配内存,而是在已有的内存块上面创建对象。用于需要反复创建并删除的对象上,可以降低分配释放内存的性能消耗。请查阅placement new相关资料。

显示调用构造函数有什么用? 

有时候,你可能由于效率考虑要用到malloc去给类对象分配内存,因为malloc是不调用构造函数的,所以这个时候会派上用场了。

 

另外下面也是可以的,虽然内置类型没有构造函数。

 

int *  i  =  ( int * )malloc( sizeof ( int ));
new  (i)  int ();

 

感觉这些奇奇怪怪的用法最好在写代码库时,为了达到某个目时去使用,不推荐应用开发时使用。

本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/08/28/1811119.html

FROM: http://www.cnblogs.com/fangyukuan/archive/2010/08/28/1811119.html





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

显式调用构造函数和析构函数 的相关文章

  • C/C++中类型变量转换之间的数值溢出

    在编程中 不同类型的值转换时会产生溢出问题 溢出问题的主要发生在类型范围大的数值转换成范围小的数值的过程中 例 double gt float gt long gt int gt short gt byte char 下面举个例子 incl
  • C++类内存分布

    书上类继承相关章节到这里就结束了 这里不妨说下C 内存分布结构 我们来看看编译器是怎么处理类成员内存分布的 特别是在继承 虚函数存在的情况下 工欲善其事 必先利其器 我们先用好Visual Studio工具 像下面这样一步一步来 先选择左侧
  • gcc4.9 编译stdatomic.h 异常

    使用了 include
  • 虚函数在对象中的内存布局

    典型地 C 通过虚函数实现多态性 多态性的定义 无论发送消息的对象属于什么类 他们均发送具有相同形式的消息 对消息的处理方式可能随接受消息的对象而变 具体地说 在某个基类上建立起来的类的层次结构中 可以对任何一个派生类的对象中的同名成员函数
  • C++中虚析构函数的作用

    我们知道 用C 开发的时候 用来做基类的类的析构函数一般都是虚函数 可是 为什么要这样做呢 下面用一个小例子来说明 有下面的两个类 class ClxBase public ClxBase virtual ClxBase virtual v
  • 链接库介绍

    什么是库 计算机中 有些文件专门用于存储可以重复使用的代码块 例如功能实用的函数或者类 我们通常将它们称为库文件 简称 库 Library 以 C 语言为例 如下展示一个函数库 myMath c int add int a int b re
  • 两个C++编译异常及解决方法-does not name a type和field `XX' has incomplete type

    两个C 编译错误及解决办法 does not name a type和field XX has incomplete type 编译错误一 XX does not name a type 编译错误二 field XX has incompl
  • C/C++语言图形化窗口创建,与设置。

    1 首先我们要引入头文件 include
  • C++异常处理机制详解

    异常处理是一种允许两个独立开发的程序组件在程序执行期间遇到程序不正常的情况 异常exception 时相互通信的机制 本文总结了19个C 异常处理中的常见问题 基本涵盖了一般C 程序开发所需的关于异常处理部分的细节 1 throw可以抛出哪
  • 23种常用设计模式(C++)

    Part One Methods for constrcting a new object 1 Factory method 我们把简单工厂方法归类到工厂方法中 工厂方法的目的是用来解决具有同一接口 基类 派生类对象的生成问题 尽管可以通过
  • Qt C++中的关键字explicit

    最近在复习QT 准备做项目了 QT Creator 默认生成的代码 explicit Dialog QWidget parent 0 中 有这么一个关键字explicit 用来修饰构造函数 以前在Windows下写程序的时候 基本上没有碰到
  • c语言---字符串为什么不能修改内容???字符串常量存放在常量区吗???

    疑惑 1 const修饰的变量都存放在常量区吗 2 字符串常量存放在那 为什么字符型指针 char 指向字符串不能修改其内容 字符串的演变 char p 123456 123456 常量字符串 char static const char
  • C++ 构造函数和析构函数是否可以继承?

    先看一个例子 cpp view plain copy include
  • 马虎的算式

    标题 马虎的算式 小明是个急性子 上小学的时候经常把老师写在黑板上的题目抄错了 有一次 老师出的题目是 36 x 495 他却给抄成了 396 x 45 但结果却很戏剧性 他的答案竟然是对的 因为 36 495 396 45 17820 类
  • 字符编码与C++

    背景 C 的项目 字符编码是一个大坑 不同平台之间的编码往往不一样 如果不同编码格式用一套字符读取格式读取就会出现乱码 所以本文旨在对字符编码的知识做一个大概的梳理 字符编码定义 计算机是以二进制的形式来存储数据的 它只认识 0 和 1 两
  • 将2个链表交替合并成一个链表

    将带有头结点的2个线性单链表交替有规则的合并成为一个链表 今天做这个的时候 又犯了以前一个愚蠢的错误 对于有些代码 为了方便我就直接复制了 编译器查出来有错 我一直看不出来错误在哪里 那一块我直接就忽略了 代码不敢随便复制 我画个图我认为直
  • c语言中的字符数组和字符串之间的关系

    一 字符串的结束标志 1 很多时候我们都是可以看到相关的内容就是 使用数组来存储字符串 也就是我们经常会使用到sizeof 和这个函数 而 这个函数只是求出当前该数组的最大容量 而不是数组中实际存放的内容 我们一般都是需要使用 0 来表示字
  • C++系列目录

    基础语言篇 C 数据类型 C位操作 C预编译处理 C指针 C结构体与枚举类型 C 函数 C 虚函数 C 容器与算法 C 类 C I O处理 C 重载操作符与转换 模板与泛型 C C 编译和调试 C C 动态链接 C C 通用MakeFile
  • 如何零基础自学c/c++语言?

    现在零基础学习C C 无非就两种方法 一种是自学还有 一种就是报班学习 关于报班学习在这里就不多说了 那么今天就说怎么从零基础开始自学C C 编程吧 先学习C语言入门 那么问题来了 怎么去学习C语言呢 一开始肯定是要看书 这里推荐的入门书籍
  • 类的数组成员变量的初始化

    使用STL标准模板库之后 编程时已经很少使用数组和指针 相反 多使用序列容器vector代替之 但事实并不这么理想 在迫不得已的情况下 我们还是会选择使用数组 这里介绍一下当数组作为类的成员变量时 应该怎么对它 数组 进行初始化 在类的构造

随机推荐

  • LVS+Keepalived群集

    目录 一 keepalived介绍 二 Keepalived及其工作原理 三 Keepalived原理剖析 四 Keepalived体系主要模块及其作用 实例 NFS服务器 192 168 80 200 主DR 服务器 192 168 30
  • TensorFlow2(版本2.5.0)学习笔记(含keras_bert、W2V)

    目录 一 设置CPU GPU运行环境 二 tf定义变量与简单操作 基于tf2做数据处理 Tokenizer 1 使用TF2实现token2id padding 2 基于gensim 版本 3 8 3 3 基于keras bert bert4
  • threejs物理效果和声音

    个人博客地址 https cxx001 gitee io 一 Threejs中如何创建物理场景 threejs中创建物理场景我们用它的扩展库 Physijs 它可以使场景中的对象有重力效果 可以相互碰撞 施加力之后可以移动 还可以通过合页和
  • Java 导入验证数据最后一行

    description 判断数据最后一行 author lkm date 2023 7 13 17 11 public static boolean isEmptyRow Row row if row null row toString i
  • python安装模块速度太慢了,教你一招提升百倍安装速度

    在python开发中 经常需要使用到各种各样的库 pip又是我们常用的安装工具 但是国外的源下载速度实在太慢 经常导致超时 对于这种情况我们可以修改pip的下载源为国内源 这样就可以大幅度提升下载速度 如何修改源 1 临时更换镜像源 可以通
  • 【代码实践】使用Garch模型估计VaR

    title Value at Risk estimation using GARCH model author Ionas Kelepouris Dimos Kelepouris date July 6 2019 output html d
  • 神经网络基础04-25个神经网络模型

    参考链接 https www toutiao com i6432188985530909186 前言 神经元 卷积神经元 Convolutional cells 和前馈神经元非常相似 除了它们只跟前一神经细胞层的部分神经元有连接 因为它们不
  • G - Card Game

    G Card Gamehttps vjudge csgrandeur cn problem Gym 102263G Zeyad and Ehab are playing a simple card game each player init
  • FISCO BCOS(十六)——— ubuntu安装go语言环境

    1 创建安装目录 mkdir home go 2 下载go安装包 wget https golang google cn dl go1 17 8 linux amd64 tar gz 3 解压go安装包 sudo tar zxvf go1
  • setup.py方式打包自己的python代码并可以用pip install安装

    setup py方式打包自己的python代码并可以用pip install安装 所需文件及目录规范 示例演示 打包静态文件补充说明 引用自己打的包 所需文件及目录规范 注意setup py文件和MANIFEST in文件需要放在和你需要打
  • 扩散模型Diffusion Model 【质量提升2.0】【扩散模型】

    扩散模型Diffusion Model 质量提升2 0 扩散模型 文章目录 扩散模型Diffusion Model 质量提升2 0 扩散模型 一 扩散模型简介 二 前向扩散简介 三 逆向扩散简介 四 目标函数 一 扩散模型简介 其最早出现在
  • 为什么人人都该懂点LLVM

    原文链接 http adriansampson net blog llvm html 作者 Adrian Sampson 译者 张洵恺 只要你和程序打交道 了解编译器架构就会令你受益无穷 无论是分析程序效率 还是模拟新的处理器和操作系统 通
  • 算法入门--递归

    不死神兔 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问第二十个月的兔子对数为多少 规律 1 1 2 2 1 3 2 5 3 这就是暴力美学 不死神兔public class t
  • TF-IDF(词频-逆文档频率)介绍与python实现

    TF IDF term frequency inverse document frequency TF IDF介绍 TF IDF 词频 逆文档频率 是一种用于信息检索 Information retrieval 与数据挖掘 data min
  • 布林通道参数用20还是26_布林线指标参数设置为13、20、26、30、60、99,那个才是最佳?...

    布林线 Boll 指标是通过计算股价的 标准差 再求股价的 信赖区间 很多炒股新人不知道怎么设置布林线的参数 13 20 26 30 60 99那个才是最佳 下面详细介绍 一起来学习吧 布林带指标参数设置多少才最佳 布林带的参数一般默认的情
  • 系统用户名为中文导致PowerShell无法正确操作conda

    本文叙述的问题诱因 系统用户名为中文 本文最后给出了解决方案 并给出了原理猜测 conda版本 4 10 3 系统版本 Win11 专业版 21H2 现象 我在Win11使用Powershell时 发现终端提示 conda没有被初始化 需要
  • Spring系列篇--关于Spring Bean完整的生命周期【附有流程图,超级易懂】

    Welcome Huihui s Code World 接下来看看由辉辉所写的关于Spring的相关操作吧 目录 Welcome Huihui s Code World 一 Spring Bean是单例模式还是多例模式 二 论证Bean是单
  • AMD历代CPU发布时间

    1969年5月1日 AMD公司以10万美元的启动资金正式成立 1997 AMD推出AMD K6处理器 1998 AMD在微处理器论坛上发布AMD速龙处理器 以前的代号为K7 1999 AMD推出AMD速龙处理器 它是业界第一款支持Micro
  • ioctl函数详细分析

    IPv4 和 IPv6 的网络接口操作使用套接字 ioctl 命令 级别 中级 Katiyar Manish manish katiyar in ibm com 软件工程师 IBM Intel Microsoft HPShweta Gupt
  • 显式调用构造函数和析构函数

    今天跟同事聊天 他说到STL源码有用到显示调用析构函数 试一了一下 果然能行 include lt iostream gt using namespace std class MyClass public MyClass cout lt l