• 关于

    析构函数

    的搜索结果

问题

为什么基类的析构函数不是虚函数时,就不会调用派生类的析构函数

a123456678 2019-12-01 20:09:12 1770 浏览量 回答数 1

回答

析构函数跟普通成员没有什么不同,只是编译器在会在特定的时候自动调用析构函数(离开作用域或者执行delete操作); 对于一个成员函数调用(不论是通过对象obj.func还是通过对象指针obj->func),到底是直接调用还是通过虚函数表调用,在编译的时候是确定的,取决于这个函数是不是虚函数; 综上,如果析构不声明为虚函数,那么delete pBase,就被编译器解释为 Base::~Base,否则被编译器解释为 this->virtual_function_table[#析构在虚函数表的偏移]

a123456678 2019-12-02 01:59:44 0 浏览量 回答数 0

回答

我所看到的行为表明答案是: 不,当父进程退出时,不会调用单例的析构函数。 这真是令人惊讶。至少我希望在父级退出时调用atexit来调用析构函数,但它没有这样做。我确认,如果单例是在父进程本身中创建的,则单例的析构函数将在退出时被调用。

peter517517 2020-02-09 10:45:26 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

java析构函数 是什么

云计算小粉 2019-12-01 19:54:17 636 浏览量 回答数 1

问题

Java中的析构函数如何定义?

YDYK 2020-04-23 22:00:55 3 浏览量 回答数 1

回答

c_str()返回的是const char*指针,所以不能用该指针改变其指向的对象。例如你的string对象是1234,你希望修改成2234,那你是不能用string函数的c_str返回值来修改它的。不是string对象在调用c_str后会被析构,而是string对象在其作用期结束的时候被析构(无论是否调用c_str)。但如果你用c_str获得了一个指针,而这个指针的作用期比string对象长,那么在string被析构后这个指针还存在,而指针指向的位置已经无效了。这就会出问题。大概是这样: const char func(){ string s = "1234"; return s.c_str(); } 这个函数是不正确的,因为在func返回的时候,s会被析构。所以你返回的const char指针,指向了一个无效区域。(注意,这个无效区域可能暂时没有被新数据覆盖,所以你在函数返回后立刻访问这个指针对象,不见得会出错,但这个区域迟早会被覆盖的。)

a123456678 2019-12-02 02:01:45 0 浏览量 回答数 0

问题

全局的类为什么不会调用析构函数呢?

a123456678 2019-12-01 20:11:09 735 浏览量 回答数 1

回答

全局类会调用析构函数,但是你在控制台看不到输出,这是因为调用的时机,此时程序已经和控制台分离了。为了证明它的确被执行了,你可以下一个断点,调试执行,那么会看到程序确实停在了析构函数上。

a123456678 2019-12-02 02:01:37 0 浏览量 回答数 0

回答

你可以除了构造函数和析构函数外,另外两个可选拷贝构造和赋值,这两个可以实现其中一个,另一个来调用。如果没有拷贝构造函数或析构函数,系统自动实现按位赋值,这样,如果存在指针会导致两个变量指向同一地方,修改其中一个就全部修改,或者删除一个,另一个也变成了空指针或野指针。所以你需要做拷贝构造或赋值,比如你重载了赋值,那么可以在拷贝构造中调用赋值,直接new一个新变量后赋值。个人认为,一般是涉及到根据一个实例去初始化另一个实例的时候,需要自定义一个拷贝构造函数(当然系统这时候一般也会默认一个)。比如类 Class Test;如果有Test a;Test b = a; 拷贝构造函数void function(Test t); 调用这个函数的时候,拷贝构造函数Test function2(); 调用这个函数的时候 return一个Test实例,拷贝构造函数。

a123456678 2019-12-02 01:59:22 0 浏览量 回答数 0

回答

struct David { var x = 0;//定义一个结构体,两个字段x,y var y = 0;//初始值 //定义结构体的构造函数 init(){ //定义一个空构造函数,真正的构造函数,调用时候不带参数调用这里 //构造函数是以init 开头的,自动调用 // [[oc alloc]init]不是构造函数 println("in init"); } init(x:Int,y:Int){ self.x = x;//定义带有2个参数的构造函数,带双参数的时候调用这里 self.y = y; println("in init(x:y:)") } //结构体有构造函数,没有析构函数 func getCenter()->Int{ return (x+y)/2; } //给现有的点x,y加偏移量 //obj.addOffset(100,deltaY:) mutating func addOffset (deltaX:Int,deltaY:Int){ //结构体是拷贝的对象,函数内部不能修改变量 //需要修改,加关键字mutating, //mutating,可以修改构造函数内部变量 x += deltaX; y += deltaY; } }; func testDavid(){ //定义一个结构体 //结构体的定义是 结构体的名字(参数名:参数值) var d = David();//调用构造函数init() var s = David(x: 100, y: 200);//调用构造函数init(x,y) println("s.x = \(s.x), s.y = \(s.y)") let c = s.getCenter();//调用析构函数getCenter println("c is \(c)"); s.addOffset(100, deltaY: 200);//因为析构函数没有返回值,所以不能赋值给变量 println("d is :\(s.x)"); } testDavid();//测试函数调用

杨冬芳 2019-12-02 03:00:21 0 浏览量 回答数 0

回答

/照我这样写可以解决你的问题,后面我解释/ #include using namespace std; class Me { public: Me() { cout << "构造" << endl; i = new int(10); }; virtual ~Me() { cout << "析构" << endl; delete i; }; void Do(); int *i; }; /*源文件*/ #if 1 #include #include "Me.h" using namespace std; void killMe(Me *me) { delete me; //之所以没有调用析构函数是因为此时的me是this指针的一份拷贝,由于Me类此时还没有完整地定义,所以不能够访问其成员, me = 0; //int a = 0; //me->i = &a; cout << "KillMe " << endl; } void Me::Do() { cout << "Do" << endl; killMe(this); }; int main() { Me *m = new Me(); m->Do(); if (0 != m) { m->Do(); } else { cout << "Do skip" << endl; } /*A *a = new A(); delete a; //掉析构 。。。 a = NULL;*/ return 0; } #endif ①是两次delete同一块内存导致崩溃② 你的问题是为什么没有调用析构函数,对吧,你刚刚运行我的代码看看是不是调用了析构函数...其实有可能是编译器的一处bug...

a123456678 2019-12-02 01:56:50 0 浏览量 回答数 0

回答

类Database专门用于操作数据库,在此类的构造函数中打开、连接数据库,析构时关闭数据库。或者,不放在 Database类的构造与析构函数中,但可以放在程序初始化与结束时。增删改查操作四个类里,不再独立定义 Database类对象,而是采用一个全局的 Database类对象代替之。

a123456678 2019-12-02 01:59:23 0 浏览量 回答数 0

问题

C++中关于copy构造函数深拷贝的问题:? 400 报错

爱吃鱼的程序员 2020-06-03 13:55:03 3 浏览量 回答数 1

问题

当进程退出时,python多处理是否调用静态变量的c++析构函数?

kun坤 2019-12-27 10:16:12 4 浏览量 回答数 1

回答

因为前者,“123”是在Func函数的内部,也就是该函数的栈上,出了函数就没有了。而后者“123”是在main函数的内部Func函数执行完了,控制流返回到了man函数还在。const引用会提高临时变量的生命周期是指,临时变量的生命周期本来只是创建该临时变量的表达式,表达式结束后,被析构,const引用将其生命周期提升到该函数结束时(如果是全局`const引用变量,那自然就是提升到整个程序的生命周期),函数结束被析构,而并不会将其生命周期提升到函数外部,函数结束时,也会被析构掉的。const引用其实和右值引用差不多,都是都是将临时变量的生命周期从该表达式提升到函数。 补充一点参考资料 Whenever a reference is bound to a temporary or to a base subobject of a temporary, the lifetime of the temporary is extended to match the lifetime of the reference, with the following exceptions: •a temporary bound to a return value of a function in a return statement is not extended: it is destroyed immediately at the end of the return expression. Such function always returns a dangling reference. •a temporary bound to a reference member in a constructor initializer list persists only until the constructor exits, not as long as the object exists. (note: such initialization is ill-formed as of DR 1696) •a temporary bound to a reference parameter in a function call exists until the end of the full expression containing that function call: if the function returns a reference, which outlives the full expression, it becomes a dangling reference.(until C++14) •a temporary bound to a reference in the initializer used in a new-expression exists until the end of the full expression containing that new-expression, not as long as the initialized object. If the initialized object outlives the full expression, its reference member becomes a dangling reference. In general, the lifetime of a temporary cannot be further extended by "passing it on": a second reference, initialized from the reference to which the temporary was bound, does not affect its lifetime. 翻译一下前两段,尤其注意加粗的字:无论何时一个绑定了一个临时变量或者一个临时变量的基类子对象的引用,临时变量的生命周期被扩展到与引用的生命周期相对应,除了一下几个例外:一个在函数的return语句中对函数的返回值的临时绑定不会被延展:它会在return语句结束时立即被销毁。这种函数总是返回一个悬垂引用。

杨冬芳 2019-12-02 02:27:24 0 浏览量 回答数 0

回答

/自定义拷贝构造函数classname(const classname &ob){//自定义拷贝构造函数的函数体} // 其中ob是用来初始另一个对象的对象的引用 class StringData{private: char *str;public:StringData(char *s){ str=new char[strlen(s)+1];strcpy(str,s);}StringData(const StringData &p){ str=new char[strlen(p.str)+1];strcpy(str,p.str);}~StringData() { delete str; }//…}; int main(){ StringData x(“abc”); StringData y(x);} 拷贝构造函数是一种特殊的构造函数。它用于依据已存在的对象建立一个新对象。如果一个对象里面有指针成员,并且这个指针已经动态分配空间了,同时,对象有析构函数对这个指针进行释放。如上面那个例子,如果我们通过这个对象创建一个新对象:A a("123");A b = a; // 调用拷贝构造函数 如果我们没有自定义拷贝构造函数,导致对象 a 和 b 的指针成员指向同一个地址空间,当对象生命周期结束时,a 和 b 都会调用析构函数,最后导致,这个指针会被释放 2 次,导致内存出问题。 所以,对象有指针成员,尽量自定义拷贝构造函数。

a123456678 2019-12-02 01:58:51 0 浏览量 回答数 0

回答

根本上是构造和析构的顺序问题。 r = std::make_shared<my_resource>(with_this_id); 语法上,一定是先执行右边的构造,然后对r进行赋值,赋值后原资源没有owner于是被析构。 所以要解决这个问题只能调整新资源的构造和原资源的析构顺序。 一是提前手动reset原资源; 二是提供一层封装,在封装函数里完成reset及make_shared操作。 但第二种方法使用起来也不是那么自然。

双持 2020-03-20 13:36:55 0 浏览量 回答数 0

回答

因为你定义了拷贝构造函数 #include <stdio.h> #include <iostream> using namespace std; class Teacher { public: Teacher(int a); Teacher(const Teacher &t2); Teacher& retT(); Teacher(int a,int b); ~Teacher(); int a; int b; }; Teacher::Teacher(int a) { this->a = a; cout << "执行Teacher构造函数 \n a=" << this->a << endl; } Teacher::Teacher(int a,int b) { this->a = a; this->b = b; cout << "执行Teacher构造函数 \n this->a=" << this->a << ";this->b=" << this->b<< endl; } Teacher::Teacher(const Teacher &t2) { this->a = t2.a; cout << "执行Teacher的copy函数 t2.a=" << t2.a << endl; } Teacher::~Teacher() { cout << "执行Teacher析构函数 this->=" << this->a << endl; } Teacher& Teacher::retT() { Teacher t1(120); Teacher &t2 = t1; return t2; } void main() { Teacher t1(12); Teacher &t2 = t1.retT(); //Teacher t2 = t1.retT(); cout << "main05中的t2.a=" << t2.a << endl; } 这么写不会调用拷贝构造函数 执行Teacher构造函数 a=12 执行Teacher构造函数 a=120 执行Teacher析构函数 this->=120 main05中的t2.a=120 执行Teacher析构函数 this->=12 Press any key to continue 这是输出

a123456678 2019-12-02 02:18:54 0 浏览量 回答数 0

回答

#include <stdio.h> #include <iostream> using namespace std; class Teacher { public: Teacher(int a); Teacher(const Teacher &t2); Teacher& retT(); Teacher(int a,int b); ~Teacher(); int a; int b; }; Teacher::Teacher(int a) { this->a = a; cout << "执行Teacher构造函数 \n a=" << this->a << endl; } Teacher::Teacher(int a,int b) { this->a = a; this->b = b; cout << "执行Teacher构造函数 \n this->a=" << this->a << ";this->b=" << this->b<< endl; } Teacher::Teacher(const Teacher &t2) { this->a = t2.a; cout << "执行Teacher的copy函数 t2.a=" << t2.a << endl; } Teacher::~Teacher() { cout << "执行Teacher析构函数 this->=" << this->a << endl; } Teacher& Teacher::retT() { Teacher t1(120); Teacher &t2 = t1; return t2; } void main() { Teacher t1(12); Teacher &t2 = t1.retT(); //Teacher t2 = t1.retT(); cout << "main05中的t2.a=" << t2.a << endl; } 这么写不会调用拷贝构造函数 执行Teacher构造函数a=12执行Teacher构造函数a=120执行Teacher析构函数 this->=120main05中的t2.a=120执行Teacher析构函数 this->=12Press any key to continue 这是输出

a123456678 2019-12-02 02:01:08 0 浏览量 回答数 0

回答

把&去掉之后,在函数调用过程中,参数传递就是复制要传入的参数生成另外一个变量(要构造一个变量所以要调用构造函数)传入函数(此处为友元函数,其他函数也是这样子)。函数调用完成之后,复制生成的变量自动调用析构函数释放。如果不去掉&,则传入参数是一个引用,参数传递过程中就复制该引用(复制的引用是指向同一个变量的,在传递过程中并没有产生新的变量,所以不会调用构造函数)。你的疑问与友元函数没有多少关系,你可以了解一下函数调用过程。

a123456678 2019-12-02 02:00:28 0 浏览量 回答数 0

回答

碰撞回调中不能对body进行移除和构析,要注册特定的回调函数才能在那函数体内安全的进行删除.话说这种问题仔细的看box2d的文档都清楚的写明了.而且此类问题发cocoachina或cocos2d-x论坛更有效.<atarget='_blank'>@小耶果谢谢前辈,做题就是搜到这个解决的回复<aclass='referer'target='_blank'>@Padding:http://ohcoder.com/blog/2012/12/12/removing-bodies-safely/请问前辈这个注册函数应该怎么处理,我连C++也是刚接触,请不吝赐教<divclass="ref"> 引用来自“小耶果”的答案<divclass=ref_body>碰撞回调中不能对body进行移除和构析,要注册特定的回调函数才能在那函数体内安全的进行删除.话说这种问题仔细的看box2d的文档都清楚的写明了.而且此类问题发cocoachina或cocos2d-x论坛更有效.

爱吃鱼的程序员 2020-06-22 17:43:15 0 浏览量 回答数 0

问题

定义一个飞机类CPlane Java

DM。 2020-05-27 10:26:20 3 浏览量 回答数 1

回答

delete pointer 是先调用构造函数,再释放pointer指向的内存;pointer->~T() 只调用析构函数,但不释放pointer指向的内存,但是,~T()里面会释放对象的动态申请的内存。

xumaojun 2019-12-02 01:56:58 0 浏览量 回答数 0

回答

delete pointer 是先调用构造函数,再释放pointer指向的内存;pointer->~T() 只调用析构函数,但不释放pointer指向的内存,但是,~T()里面会释放对象的动态申请的内存。

nothingfinal 2019-12-02 01:56:57 0 浏览量 回答数 0

回答

碰撞回调中不能对body进行移除和构析,要注册特定的回调函数才能在那函数体内安全的进行删除.话说这种问题仔细的看box2d的文档都清楚的写明了.而且此类问题发cocoachina或cocos2d-x论坛更有效.

杨冬芳 2019-12-02 03:01:38 0 浏览量 回答数 0

回答

因为int 是内置类型,系统并没有给他提供析构函数

a123456678 2019-12-02 01:56:57 0 浏览量 回答数 0

回答

不需要,Value的析构函数等会自己释放对应的资源

杨冬芳 2019-12-02 03:03:46 0 浏览量 回答数 0

回答

rapidJson更好用不需要,Value的析构函数等会自己释放对应的资源

杨冬芳 2019-12-02 03:07:50 0 浏览量 回答数 0

问题

关于c++中c_str函数的一些问题

a123456678 2019-12-01 20:11:17 1144 浏览量 回答数 1

回答

试试看在析构函数里写上:thread->quit(); thread->wait();

a123456678 2019-12-02 02:48:18 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站