踩内存是什么意思啊_面试|搬了这么久的砖,居然还不知道什么“踩内存”
摘要:你是否在總是聽到“內存越界”,“指針指向了非法地址”等常見問題呢?但是在面試過程中總有一些學術嚴謹(裝13)的面試官給這一類問題取個名字-踩內存。如果你沒聽過,是不是就顯得沒品味(正常)。簡而言之,踩內存就指訪問了不應該訪問的內存地址。
關于踩內存
踩內存就是訪問了不應該訪問的內存,常見有幾種:
1、越界踩;
越界踩的意思就是踩壞的內存就在你分配內存的旁邊,也就是在界限附近,出現這種情況一般是由于申請的內存小了。舉個例子:
char *p;
p = malloc(5);strcpy(p, "hello");
strcpy拷貝了6個字節(字符串“hello”有6個字節,包括最后的‘0’),但是指針p指向所分配的內存只有5個字節,所以就越界了。
當然還有一種情況就是數組越界,這也是新手時常發生的,這也屬于一種越界踩,除此之外,越界踩還有一種比較難發現的情況,就是棧溢出的情況,我們知道棧內存一般都是有固定大小的,如果一個函數里面變量過多大就會導致棧溢出,出現越界踩。舉個例子:
int func(){
char tmp[1024000000000];
for(int i = 0;i < 1024000000;i++){
tmp='H';
}
}
2、use after free;
這種情況是由于指針在使用的之前又被釋放掉,那么這塊內存很有可能又被分配出去了。這個理解起來就比較簡單:
char *p;
p = malloc(6);strcpy(p, "hello");free(p); // p內存被回收了strcpy(p, "world"); /* p內存很可能再次被分配出去,這條語句直接把屬于你的內存踩壞 */
3、隨機踩;
如果出現隨機踩的話,那么問題排查起來就比較頭痛了,因為不知道是在程序的哪個位置出現問題,因為有可能每次出現問題的地方都不一樣,下面簡單列舉一個例子:
int func(int i){
char tmp[10];
tmp='H';
}
這種情況下變量i沒有做范圍檢查有可能是負數有可能很大,所以每次踩壞的地方都不一樣,還有一種情況即就是沒有初始化。
總結
當面試過程中被問到“踩內存”改該如何回答呢?
我遇到過踩內存的,踩內存就是訪問了不應該訪問的內存地址,比如過說數組或內存越界啊,指針未初始化啊或使用的時候已經被釋放掉啊等都會造成踩內存的現象。
那么我們為了避免出現這種低級bug,需要養成:
1.入參一定要做邊界檢查,防止溢出
2. 代碼不要嵌套太深,在多線程多通道的場景下,很容易重復釋放/申請資源
3. 不要定義過多的局部變量,數組,防止棧溢出,內核中棧的大小是8k吧。看情況使用kmalloc
4. 釋放了的資源及時置空,如果不是立馬就return的話。分支比較多的代碼,很容易就~~~
Q:出現了踩內存應該如何排查?
A:通過gdb進行調試定位出問題的代碼,如果是隨機踩的情況,可以借助valgrind工具進行排查。
公眾號:【PisCO菜鳥成長】
總結
以上是生活随笔為你收集整理的踩内存是什么意思啊_面试|搬了这么久的砖,居然还不知道什么“踩内存”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 红花生的功效与作用、禁忌和食用方法
- 下一篇: 小麦草的功效与作用、禁忌和食用方法