C 智慧型指標和普通指標引數的使用問題

2021-10-08 19:49:46 字數 1585 閱讀 5319

char

* str =

(char

*)pvargtocompletionroutine; string ss=str;

記憶體洩漏:給乙個物件申請一塊記憶體空間,由於某種原因這塊記憶體未釋放掉,這塊記憶體被占用導致應用卡頓等。 記憶體溢位:擁有一塊20位元組的記憶體空間,你將30位元組的檔案寫入其中,就會造成溢位。 string的記憶體管理是由系統處理,除非系統記憶體池用完,不然不會出現這種記憶體問題。 char *的記憶體管理由使用者自己處理,很容易出現記憶體不足的問題。 雖然指標都會存在記憶體問題,但我們這裡是直接轉換過來,資料量也在指標所能承受的範圍之類,所以這裡並不會存在記憶體溢位

csontype* son =

new csontype;

void

*pvoid = son;

delete pvoid;

無論是否託管**,將物件指標只賦給無型別指標void*,c++在釋放掉這個物件時,不會針對物件內已動態分配的記憶體做任何釋放操作。哪怕析構函式是虛函式,也不會被呼叫。

// 正確的釋放記憶體方式

cfathertype* pfather =

(cfathertype *

) pvoid;

delete pfather;

將這個無型別指標轉而賦值給cfathertype*,編譯器知道了具體的物件型別,才能針對性進行物件內部分配的動態記憶體進行釋放。

只有對物件指標進行delete操作,c++才會自動呼叫物件的析構函式。

這取決於「安全」。通常會起作用,因為資訊與有關分配本身的指標一起儲存,因此取消分配器可以將其返回到正確的位置。從這個意義上講,只要您的分配器使用內部邊界標記,它就是「安全的」。(很多)

但是,如其他答案所述,刪除void指標不會呼叫析構函式,這可能是乙個問題。從這個意義上講,它不是「安全的」。

沒有充分的理由按照自己的方式去做自己的事情。如果要編寫自己的釋放函式,則可以使用函式模板來生成具有正確型別的函式。這樣做的乙個很好的理由是生成池分配器,它對於特定型別可能非常高效。

如其他答案中所述,這是c ++中的未定義行為。通常,最好避免出現不確定的行為,儘管主題本身很複雜並且充滿了相互矛盾的觀點。

const

char

* attstr =

strdup

(othercharstr)

;string str

(attstr,

strlen

(attstr));

delete str;

//???

您需要釋放attstr而不是僅將釋放c++字串的資源str。

void

func()

//here str will release its own resources

你也可以做字串str = othercharstr; 就是這樣。只檢查othercharstr會發生什麼。

我建議閱讀一些有關智慧型指標的內容,這些指標將自動刪除它們指向的物件。我與最初的問題相距甚遠,但是該主題對於理解c ++的工作方式非常重要。

普通指標到智慧型指標的轉換

普通指標到智慧型指標的轉換 int iptr new int 42 shared ptr int p iptr 智慧型指標到普通指標的轉換 int pi p.get 注意的地方 那就是不要將智慧型指標與普通指標混用。如果專案允許,堅持使用智慧型指標,避免原生指標。智慧型指標與普通指標需要特別特別特別...

C 智慧型指標使用

由於 c 語言沒有自動記憶體 機制,程式設計師每次 new 出來的記憶體都要手動 delete。程式設計師忘記 delete,流程太複雜,最終導致沒有 delete,異常導致程式過早退出,沒有執行 delete 的情況並不罕見。std auto ptr boost scoped ptr boost ...

C 智慧型指標的使用

測試環境 win7,vs2012 如果未安裝boost,請參考 涉及智慧型指標 shared ptr,weak ptr,scoped ptr,auto ptr 其它 enable shared from this 總呼叫函式 testsmartpointer 可以將其放在main 中執行。解釋在 中...