C++关于析构的问题/C++关于析构的问题

为啥返回t就析构2次?返回d就析构3次?//date是类
图片说明

图片说明

3个回答

图片说明

建议你用vc++
用vc++在你的析构函数上下断点,看触发几次断点,就是调用了几次。
在控制台看,不准确。因为程序关闭,可能控制台先关闭,再调用析构函数,这样实际调用了,但是你看不到。
还有一个,就是编译器会优化掉没有用的变量。比如你函数定义的变量,没有修改,可能直接被优化了。这个也可以用vc++的反汇编功能看下。

这种情况跟编译器优化有关,关于第二张图,我是用的vs2017编译器,在release下是析构两次,debug下都是析构三次
图片说明
图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C/C++面试题:构造函数与析构函数
构造函数与析构函数的一道小题下面程序的输出是什么?#include<iostream>using namespace std;class TestClass{ char x; public: TestClass() { cout << 'A'; } TestClass(char c) { cout << c; } ~TestClass() { cout << 'B';
C++拷贝构造器之浅拷贝与内存重析构
一般构造器、析构器、拷贝构造器会被称之为构造函数、析构函数与复制构造函数,但是其与函数还是有一些区别,所以我们以“器”来称呼之。1、构造器、析构器与拷贝构造器:(1)、构造器简析: constructor 构造器 * 与类名相同A(),(A为类名),无返回值,生成对象时系统自行调用,相当于初始化 * 可以有参数,能够重载、以及设置默认参数 * 如果不自定
C++多继承中菱形继承构造函数与析构函数执行的顺序
// test1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" using namespace std; class A { public:A() { cout<<"A 类构造函数"<<endl; } public:~A() { cout<<"A 类析构函数"<<endl; } }
C++类成员构造函数和析构函数顺序示例详细讲解
这篇文章主要介绍了C++类成员构造和析构顺序示例,看了这个例子大家就可以明白c++构造析构的奥秘 对象并不是突然建立起来的,创建对象必须时必须同时创建父类以及包含于其中的对象。C++遵循如下的创建顺序: (1)如果某个类具体基类,执行基类的默认构造函数。 (2)类的非静态数据成员,按照声明的顺序创建。 (3)执行该类的构造函数。 即构造类时,会先构
常见笔/面试题-之构造函数和析构函数
常见笔/面试题-之构造函数和析构函数构造函数是用来初始化一个对象的,而析构函数的作用则是释放对象占用的空间。如果将虚函数、构造函数和析构函数结合起来会有怎么样的效果呢? 构造函数可以是虚函数吗?答:构造函数不可以是虚函数!基于以下几点原因:(1)构造一个对象的时候,必须知道对象的实际类型,而虚函数行为是在运行期间动态确定实际类型的。在构建一个对象时,构造函数执行期间,对象未完全构建完成,编译器无法知
C++类成员对象析构问题
代码块
聊聊C++临时对象的析构时间点------顺便再次提醒大家谨慎使用string的c_str方法
C++临时对象的析构?这不是很简单么?其实没那么简单。 我们先看看如下程序吧:
C语言的构造函数与析构函数
__attribute__((constructor))  与 __attribute__((destructor)) #include void _init(void)__attribute__((constructor)); void _fini(void)__attribute__((destructor)); void _init(void) { printf("c
关于单例类模板析构的问题
关于单例类模板析构的问题 单例类是大家所熟悉的,在程序里面只需要一个实例,并且生命周期和程序一样长,就可以用单例模式。但是单例模式销毁是个问题,因为在关闭程序的时候,程序不会自动调用单例类的析构函数的。 解决办法: 在单例模板类里面添加一个内嵌类(本文这里叫CGarbo)专门是为了析构单例类而建立的类。利用这个内嵌类声明一个静态成员变量sGarbo.因为在c++里面静态成员函数会被自动
【C++】深度探索C++对象模型之构造、析构、拷贝语意学
一、纯虚函数的存在 可以定义和调用一个pure virtual function, 不过只能被静态调用(invoked statitcally),不能经由虚拟机制调用 Abstract_base::interface();如上述,Abstract_base是一个虚基类。这只取决于类设计者要不要这么做。 但是对于pure virtual destrcutor, 类设计者一定要定义它,因为每个d
【C++总结】关于函数返回对象析构的问题
class Person {public: string name; public: Person() { name = "ttf"; } ~Person(){ cout << this->name <<endl;; } Person &changeName(); };Person &Person::changeName
单例模式的自动析构
总所周知,单例模式如果不主动调用,在进程结束时是不会析构的,而是仅仅把内存释放掉而已 所以,如果希望在析构时进行某些操作,在进程结束前,可以主动调用析构函数,如下面类中的delMe函数(xSingleton::getMe().delMe();) 可是,如果每定义这样一个类,都
对同一类进行两次析构的问题
对于同一个类进行两次析构一般情况不会出现任何wenti
TinyXML注意事项
使用TinyXml库值得注意的几个地方   (2012-12-16 17:46:49) 转载    这两天仔细看了下TinyXml的源代码, 完美地搞清楚了一些网友和我自己的很多疑问. 鉴于TinyXml的实用性, 而且现在不少人在使用, 就决定在此做点有意义的事情 ---- 列出使用TinyXml库值得注意的几个地方.      关于TinyXml库的介绍网上
如何解决vector 析构异常 opencv Assert _CrtIsValidHeapPointer
vector 析构异常 opencv Assert _CrtIsValidHeapPointer
C++之匿名对象与析构函数的关系
#include using namespace std; class Location{ public: Location(int xx = 0, int yy = 0){ X = xx; Y = yy; cout << "Constructor Object.\n"; } Location(const Location& obj){//copy构造函数 X = obj.X;
析构的问题
关于以下代码,哪个说法是正确的? 1 2 3 4 5 6 7 8 myClass::foo(){ delete this; } .. void func(){ myClass *a = new myClass(); a->foo(); } 正确答案: B 你的答案: C (错误)a它会引起栈溢出 b都不正确 c它不能编译 d它会引起
C++之继承(多重继承+多继承+虚继承+虚析构函数+重定义)
多重继承和多继承 这个我们来讲讲这两个的概念问题,一字之差,千差万别。 多重继承,比如有三个类,人类-士兵类-步兵类,三个依次继承,这样的继承称为多重继承。class Person {};class Soldier :public Person {};class Infantryman :public Soldier {};多继承是如果一个类有多个基类,比如农民工类继承了农民类和工人类。clas
Objective-C学习笔记---构造函数和析构函数
简单的讲,构造函数就是在创建一个对象的时候起到初始化的作用,对这个对象里的一些成员变量进行初始化,析构函数就是在对象被删除进行一些清理工作,也就是专门的扫尾工作,下面用代码来进行具体说明。   一、构造函数   在OC中凡是已init开头的函数我们都称之为构造函数,在声明构造函数的时候,不带参数的一般直接声明为“-(id)init”,带参数的一般声明为“-(id)initWith
关于pool的析构问题
是在不知道pool类的析构函数怎么写
关于MFC CFileDlg使用,析构时访问空指针崩溃问题的解决办法
1、在工程中查找宏定义#define _WIN32_WINNT 2、修改 #define _WIN32_WINNT 0x0501宏定义为#define _WIN32_WINNT 0x0400 3、clean工程,重新编译ok
C++中结构体中的析构函数和构造函数
在C++中除了类中可以有构造函数和析构函数外,结构体中也可以包含构造函数和析构函数,这是因为结构体和类基 本雷同,唯一区别是,类中成员变量默认为私有,而结构体中则为公有。注意,C++中的结构体是可以有析构函数和构造 函数,而C则不允许。至于联合体,它是不可能有析构函数和构造函数的。本质上,它是一种内存覆盖技术的体现,也就 是说,同一块内存在不同的时刻存储不同的值(可能是不同类型的)。 例子
C++中struct也有构造函数与析构函数,也可以有访问类型控制以及结构体大小,类大小
C++中struct也有构造函数与析构函数,也可以有访问类型控制,可以用private关键字。如下所示: #include struct point { public: point():x_(0.0),y_(0.0) { std::cout<<"default constructor point\n"; }
C++析构顺序
设已经有A,B,C,D4个类的定义,程序中A,B,C,D析构函数调用顺序为? 1 2 3 4 5 6 7 8 C c; void main() {     A*pa=new A();     B b;     static D d;     del
C++中基类的虚析构函数问题
c++中如果定义基类,要使用多态的话,基类的析构函数必须定义为虚函数,这样在析构的时候,资源才会回收干净,否则只会回收基类资源,而不会回收继承类资源。
先构造的一定后析构么,后构造的一定先析构么?
先构造的一定后析构么,后构造一定先析构么? 首先要看一个 /* 设已经有A,B,C,D 4个类的定义,程序中A,B,C,D 析构函数调用顺序 */ C c; void main () { A* pa = new A (); B b; static D d; delete pa; } ABCD都是类,所以我们要看一下他们析构和构造的顺序。 首
单链表的析构函数
刚看到一个单链表的析构方法,是我上次没有想到的,记下来,其实很简单,就是从链表的第一个开始析构,然后循环析构第一个结点,直到只剩下第一个结点,然后释放它。 LinkList::~LinkList() { Node *tempptr; while(head->next!=NULL) { tempptr=head->next; delete head; head=tempptr;
C++ 全局对象构造和析构
C++中的全局对象构造析构函数执行时间
c++中析构函数调用时机的研究
众所周知,c++中的每个类都会有一个析构函数,当这个类的对象被销毁的时候,对象会自动调用析构函数。那么什么情况下对象的析构函数会被自动调用呢?其实这个问题也可以换种方式问,什么情况下对象会被自动销毁。
拷贝构造函数执行后析构函数调用两次出错问题
#ifndef FILENAME#define FILENAMEint k=10;class Oblong{public: void out_area() const; //声明计算面积函数 Oblong() //没有参数的构造函数 { p_width = new int; p_h
my学习OC--类的构造函数和析构函数
1. init继承于NSObject这个根类,所有的子类可以不用重写这个实例方法函数,当然也可以在自己的类里重写init实例方法 2.  可以自定义构造函数
关于多态里父类的析构函数造成子类内存泄露的问题
最近在学c++,学到多态,发现一个有趣的问题,先来看一段代码: #include using namespace std; class Database{ public: virtual void connect(){cout << "Database connected!" << endl;} virtual void query()const{c
Java中的 finalize() 与c++的析构函数 分析
《JAVA编程思想》: java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。       (1).对象不一定会被回收。        (2).垃圾回收不是析构函数。        (3).垃圾回收只与内存有关。        (4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪
struct结构体中定义构造函数和析构函数
struct CTest { CTest(); ~CTest(); int num; }; CTest::CTest() { } CTest::~CTest() { } [...] struct CTest * pTest = new struct CTest(); [...] 和class几乎没有区别。
Effective STL 第7条:如果容器中包含了通过new操作创建的指针,切记在容器对象析构前将指针delete掉
STL中的容器相当“聪明”,它们提供了迭代器,以便进行向后和向前的遍历(通过begin、end、rbegin等);它们告诉你所包含的元素类型(通过它们的value_type类型定义);在插入和删除的过程中,它们自己进行必要的内存管理;它们报告自己有多少对象,最多能容纳多少对象(分别通过size和max_size);当然,当它们自身被析构时,它们自动析构所包含的每个对象。        有了这么“
堆栈上std::vector 析构后,程序崩溃,原来是我的project file里库文件指示出错
这个问题不是很常见,但是搞了我两天。涉及到一个工程从VC10转到VC11,然后可能出现这个问题。
C++-自动析构时的顺序
C++:自动析构时的顺序标签(空格分隔): Cpp自动析构时是先析构后构造的. //普通(非模板)类的成员模板 class DebugDelete{ public: DebugDelete(ostream &s = cerr) :os(s){} template <typename T>void operator()(T*p)const { os << "de
C++ 单例模式析构函数的运用
单例模式也称为单件模式、单子模式,可能是使用最广泛的设计模式。其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程 序模块共享。有很多地方需要这样的功能模块,如系统的日志输出,GUI应用必须是单鼠标,MODEM的联接需要一条且只需要一条电话线,操作系统只能有一 个窗口管理器,一台PC连一个键盘。 单例模式有许多种实现方法,在C++中,甚至可以直接用一个全局变量做到这一
[C++]多个对象构造、析构、构造和析构的顺序
#include //多个对象构造和析构//1)当类中有成员变量是其它类的对象时,首先调用成员变量的构造函数,调用顺序与声明顺序相同;//之后调用自身类的构造函数//2)析构函数的调用顺序与对应的构造函数调用顺序相反////2、类成员中若有const修饰,必须在对象初始化的时候,给const int n 赋值//当类成员中含有一个const对象时,或者是一个引用时,他们也必须要通过成员初始化列表进
[c++]怎么样知道析构函数先后的析构顺序
#include #include using namespace std; class String_date { private: char * str; public: String_date(char * str); ~String_date(); char* get_infor() {return str;} }; String_date::Str
相关热词 c#该名称在封闭局部范围 c#泛型 排序 c# 测试连接mysql c# 多线程 调用界面值 c# gdi unity c#反射构造带参对象 一起自学c# c#工厂方法 c# 对象属性保存xml u3d用c#写拾取物品