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