C 中為什麼有delete 這種寫法?

時間 2021-05-29 22:57:52

1樓:

因為物件導向的, 所以很麻煩.

如果delete既能釋放乙個元素, 又能釋放乙個陣列, 會造成混淆, 還會在申請釋放時做額外的判斷, 浪費額外的記憶體.

那樣的話不如乾脆不提供new 了.自己建立陣列儲存.

CT* t[10] = ;

for(int i=0; i<10; i++)

2樓:陳碩

> 新的標準和編譯器擴充套件為什麼不能實現這個簡單的功能呢?

因為違反了 zero overhead 原則。

實現這個功能不複雜,無非是把物件的new視為長度為1的陣列的new,即:

String* p1 = new String;

編譯器改寫為:

String* p2 = new String[1];

然後統一用 delete 來釋放(把delete也看成delete)。

只不過這麼做對於non-POD型別需要乙個額外的長度來儲存物件的個數,因此增加了開銷,違反了原則。通常要比sizeof(String) 多分配sizeof(size_t)來儲存這個「數」。

發散一下,假如下一版的編譯器/標準真的這麼做了,就會有人為了省這麼幾個位元組,用 malloc(sizeof(String)) + placement new 來退回原來(現在)的行為,並且把這個「技巧」寫進下一版的 Effective C++ 或 Efficient C++。

另外 Base* p = new Derived[10]; 就算用 delete p; 也不能正確釋放,除非編譯器做了擴充套件。

為什麼你不用 C 寫網頁?

fhh 嚴格意義上來說,C 可以寫網頁。任何能夠處理傳遞的字串引數的語言,都可以被用來寫網頁。BASIC可以,C可以,Perl可以,C 當然也可以。CGI技術即可實現lz的要求。 Belleve 你說的是 wasm?但是 wasm 沒有 DOM 介面啊 不過似乎 Figma 的繪圖邏輯是用 wasm...

寫同人文或者語c有什麼意義?

Lemon 不請自來。本來看見這個問題想進來大展拳腳好好說一說我對同人的愛,但是看你後面詳細的描述,又感覺沒有必要了。我發現你是明白我們寫同人是因為 愛 爽 和 共情 的,只是不能理解。那麼我建議,不要想著去理解了。理解不了就不要關注這些了。不管底下的回答怎麼說也很難讓你理解的。沒有冒犯的意思,只是...

c 中明明有vector了為什麼還要有stack?

飛翔的荷蘭豬 作為乙個類的設計者,不僅要考慮類的使用者所需要的的功能,也要考慮如何限制類使用者的不當操作。同樣當需要乙個stack的時候,很有可能下標訪問,中間插入等操作,會影響物件本身功能的時候。要限制這種操作,一是注釋告訴物件使用者,禁止使用下標訪問等操作,當更好的辦法是,從根本上就不提供這樣的...