亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C++多繼承和釋放內存

C++多繼承和釋放內存

C++
Carmel_Evans 2019-02-19 15:36:34
#include <iostream>#include <string>using namespace std;class N{public: N() { cout<<"N()"<<endl; } ~N() { cout<<"~N()"<<endl; } void set_name() { name = "Jim"; } string get_name() { return name; }protected: string name; };class B:public N{public: B() { cout<<"B()"<<endl; } ~B() { cout<<"~B()"<<endl; }};class C:public B{public: C() { cout<<"C()"<<endl; } ~C() { cout<<"~C()"<<endl; }};void text(C *n){ n->set_name(); delete n; n = NULL; }int main (){ C c; text(&c); ? ? return 0;}看看這個代碼為什么運行時,調用了兩次析構函數?而且視頻中老師是說并不創建臨時變量的呀
查看完整描述

1 回答

已采納
?
onemoo

TA貢獻883條經驗 獲得超454個贊

問題出在 test 函數中的 delete 上。你不應該 delete 的。


delete 一個指針會引起指針所指對象被析構,但前提是這個對象必須是被 new 出來的。 這個 test 中的 c 所指的是 main 函數中的 c,它并不是用 new 構造的,不應該被 delete!

delete 了不正確的指針會引起什么后果呢? 不確定!? C++ 標準并沒有規定這時會發生什么。在有的平臺下可能看不出什么影響;有的平臺下可能會引起重復析構(你遇到的很像這種)......甚至更嚴重的(更隱晦的)錯誤。 總之,你知道這樣做是錯的就好了。


題目中你提到“釋放內存”。這里的 c 就是一個簡單的局部變量,并不需要額外的操作來“釋放”它。當它結束生存期時會被自動釋放。? ?如果這個 c 是被 new 出來的,才應該主動 delete 掉。


另外,也許是你術語運用得不對。你這里就是普通的“單繼承”,并不是“多繼承”。多繼承通常指的是子類同時派生自多個父類。

查看完整回答
1 反對 回復 2019-02-19
  • Carmel_Evans
    Carmel_Evans
    十分感謝您能回答我的問題!術語確實錯了,應該是多重繼承。我現在知道哪里錯了,謝謝!
  • 1 回答
  • 0 關注
  • 1077 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號