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