c/c++ 溢位、越界、洩漏個人小結

大囚長發表於2019-01-03

轉載:
https://blog.csdn.net/wangkui1331/article/details/80475941

1.溢位

c/c++溢位是指進行拷貝操作時接收的buf小於原buf產生的現象,分為棧溢位和記憶體溢位

1)棧溢位
a.棧溢位是指函式中的區域性變數造成的溢位(注:函式中形參和函式中的區域性變數存放在棧上)

棧的大小通常是1M-2M,所以棧溢位包含兩種情況,一是分配的的大小超過棧的最大值,二是分配的大小沒有超過最大值,但是接收的buf比原buf小

例子1:(分配的的大小超過棧的最大值)

void

{

char a[99999999999999999];

}

例子2:(接收的buf比原buf小)

void

{

char a[10] = {0};

strcpy(a, "abjjijjlljiojohihiihiiiiiiiiiiiiiiiiiiiiiiiiii");

}

注意:除錯時棧溢位的異常要在函式呼叫結束後才會檢測到,因為棧是在函式結束時才會開始進行出棧操作

如:

int main(int argc, char* argv[])

{

char a[10] = {0};

strcpy(a, "abjjijjlljiojohihiihiiiiiiiiiiiiiiiiiiiiiiiiii");

exit(0);

return 0;

}

這種情況是檢測不到棧溢位的,因為函式還沒執行完就退出了

void fun()

{

char a[10] = {0};

strcpy(a, "abjjijjlljiojohihiihiiiiiiiiiiiiiiiiiiiiiiiiii");

}

int main(int argc, char* argv[])

{

fun();

exit(0);

return 0;

}

這種情況呼叫完fun函式就會檢測到異常了

b.棧溢位的解決辦法

如果是超過棧的大小時,那就直接換成用堆;如果是不超過棧大小但是分配值小的,就增大分配的大小

2)記憶體溢位

使用malloc和new分配的記憶體,在拷貝時接收buf小於原buf時造成的現象

解決:增加分配的大小

2.越界

越界通常指的是陣列越界,如

char a[9]={0};
cout << a[9] << endl;

3.洩漏

這裡洩漏通常是指記憶體洩漏,是指使用malloc和new分配的記憶體沒有釋放造成的

相關文章