int *p = new int[10];
delete [] p;
既然 delete 時無需提供數(shù)組大小,那么顯然編譯器是知道數(shù)組的大小(或者說界限的)。
那么
編譯器是如何知道數(shù)組大小的?(比如維護(hù)了一張表、按特定格式存儲……)
既然知道數(shù)組大小,編譯器能否自動檢查數(shù)組越界的情況?不檢查是否是為了性能?
編程時如何利用這份信息?
另外,不借助搜索引擎如何解答這個問題,有類似文檔之類的東西可以參考嗎?修改
1:拿msvc來說,在new/malloc返回的ptr前n個字節(jié)里保存了大小,msvc還可以用_msize()來獲得size,具體保存在哪可以調(diào)試看看;
2:編譯器未必知道,有些size是運(yùn)行時決定的.真正記錄大小是在運(yùn)行時,而不是編譯期.數(shù)組越界不能自動檢查,ptr + offset,這種方式程序無法知道程序員的本意要訪問的到底是不是數(shù)組那塊內(nèi)存
3:特定環(huán)境下可能有用啊.(例:一個妹子問我在vs里怎么通過一個new出來的指針獲得size,然后就可以利用這些信息換妹子崇拜的眼神)
PS:上調(diào)試器.
作者:吉林小伙
鏈接:https://www.zhihu.com/question/27112272/answer/35301722
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
1:new的時候已經(jīng)多new了點(diǎn)空間把長度寫進(jìn)去了
2:不能檢查,因為不是所有的指針都是new出來,誰知道到底指向的是什么
3:根據(jù)C++標(biāo)準(zhǔn)的話,沒辦法利用
4:反正VC++已經(jīng)98%以上跟標(biāo)準(zhǔn)完全一致了,而且gcc跟clang的私貨也不比VC++少,你去msdn看C++語法手冊就好了 C++ Language Reference,手冊只要你讀兩遍,你就什么都明白了。我初三就是讀了兩遍VC++5.0時代的msdn的語法手冊學(xué)會C++的。當(dāng)然要熟悉還是要靠練習(xí),光讀的話就算都記住了,也只能一知半解。
作者:vczh
鏈接:https://www.zhihu.com/question/27112272/answer/35291952
來源:知乎
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。