M27 要求或者禁止物件產生於heap之中

2021-09-08 14:20:34 字數 1630 閱讀 9954

1、要求物件只能產生於heap之中,該怎麼辦?

棧上的物件肯定呼叫構造方法和析構方法(離開作用域的時候),因此,要求物件只能產生於heap之中,也就是禁止棧上產生物件,解決辦法有兩種:將所有的構造方法宣告為private,或者將析構方法宣告為private。

2、將所有的構造方法宣告為private,這樣就不能在棧上構造物件了。這有兩點需要注意:

a、這種情況下,不能在外部使用new operator在堆上構造物件,因為new operator要在分配的記憶體上,呼叫構造方法構造物件。因此,需要重新暴露介面,返回堆上的物件。辦法有:在類內部使用new operator,暴露static方法;使用友元方法或者友元類。

b、乙個類往往有多個構造方法,必須將所有的構造方法都宣告為private。對於default 構造方法,如果沒有宣告任何構造方法,編譯器會自動生成乙個。對於copy構造,沒有宣告,編譯器也會自動生成乙個。

3、將析構方法宣告為private,由於棧物件離開作用域,會自動呼叫析構方法,出現錯誤,在編譯時就報錯。這有兩點需要注意:

a、這種情況下,不能在外部使用delete operator刪除指標,因為delete operator要呼叫析構方法,然後呼叫operator delete釋放記憶體。因此,需要重新暴露介面,destroy方法,在destroy方法內部呼叫delete operator。

b、相比於構造方法,析構方法只有乙個,只需要將這乙個析構方法宣告為private就好了。

4、需要注意,將構造方法或者析構方法宣告為private,將導致兩個問題,那就是繼承和內含,這兩種情況都要呼叫構造方法和析構方法。

對於繼承,可以將父類的構造方法和析構方法放大訪問許可權,為protected。

對於內含乙個物件,修改為內含乙個指標,指向物件。使用其他暴露的藉口,獲取堆上的物件和釋放記憶體(destroy)。

5、考慮下面的問題,如何判斷某個物件是否位於heap內?

6、我們知道,在堆上建立物件必定呼叫operator new分配記憶體,因此,可以在operator new呼叫的時候,標識將要產生的物件在堆上,物件構造後,然後清除標識。這有兩個問題:a、對於陣列,使用operator new,一次性分配多個記憶體,只有第乙個物件是分配在堆上。b、考慮new upnumber(* new upnumber),c++的執行順序可能是先呼叫兩次operator new,在呼叫兩次構造方法,導致上述的辦法失效。

7、c++程式的記憶體布局,從高到低以此為stack,heap,靜態儲存區,stack向下增長,heap向上增長。在棧上建立乙個物件,如果目標物件在棧上,新建的物件位址,肯定小於目標物件的位址。因此,新建物件的位址小於目標物件的位址,說明目標物件在棧上,否則在堆上。這裡有個小問題,目標物件也可能在靜態儲存區。另外,這種做法不具有移植性,有些系統的記憶體布局不是上面的情況。

8、判斷物件是否在堆上,很難辦。思考下,我們為什麼要判斷物件是否在堆上?真實的需求是,判斷執行delete是否安全。那怎麼辦呢?

對於分配獲取的指標,放到乙個集合,delete指標的時候,判斷指標是否在集合,如果在集合,執行delete就是安全的,否則不安全。

9、如何禁止物件產生於heap之中?

這個很簡單,在堆上建立物件,必定呼叫operator new分配記憶體,因此將operator new宣告為private就好了。

2 7 m 序列的安全性

即尋找m序列的遞推關係式。已知一段序列,如果知道其反饋多項式,就可以將其後的序列依次求出,那反饋多項式呢?線性反饋移位暫存器綜合解 b m演算法 這裡c與a挨個相乘,就是包含了所有情況,去解乙個大方程。線性移位暫存器的綜合問題可表述為 給定乙個n長的二元序列a,如何求出產生這一串行的最小級數的線性移...

現代軟體工程 M1 部落格要求

各個小組都大致確定了自己的專案和人員分工,這太好了。第乙個里程碑馬上就要開始了。請同學們按照下表的要求,把各個角色,各個階段要做的事情都快速地用部落格表達出來吧。每個部落格的截止日期是 每日部落格 第二天早上9點。每週部落格 下一周周一早上9點。每個團隊有6 7 個人,如果把工作分配好的話,每個人的...

現代軟體工程 M2 部落格要求

和m1 類似 131 24 dev history 微軟軟體開發管理的歷史 milestone 2 里程碑2 部落格 列出m2 的計畫,所有的任務 task 把bug bash 的報告分類加入tfs 作為bug 公布人員的角色,可以考慮在這一周開始scrum.n a1 31 holiday holi...