C++ :Signal: SIGSEGV (Segmentation fault) ,深拷贝
C++在運(yùn)行時(shí)出現(xiàn)Signal: SIGSEGV (Segmentation fault)? 問(wèn)題,通常是訪問(wèn)了系統(tǒng)給這個(gè)程序所分配以外的內(nèi)存空間。從而出現(xiàn)段錯(cuò)誤,經(jīng)常在使用指針時(shí)會(huì)出現(xiàn)。
例如
bounds_ =(int *)malloc(2 * sizeof(int)) bonuds_[0]= 0 ; bonuns_[1]= 1 ;base = bound; cout<<base[0]; // 0 free(bound); cout<<base[0]; //Signal: SIGSEGV (Segmentation fault)因?yàn)榻o在base = bound 中,把bound中的所指向的地址值temp賦值給base,而在free(bound)中,把動(dòng)態(tài)分配的內(nèi)存temo給施放了,此時(shí)再用base來(lái)訪問(wèn)temp 就會(huì)出現(xiàn)段錯(cuò)誤,因?yàn)樵L問(wèn)了程序所分配的以外的內(nèi)存空間。
上述 base = bound 指針之間直接賦值屬于淺拷貝,兩個(gè)指針變量所指向的是同一個(gè)內(nèi)存空間。而深拷貝,就是賦值的時(shí)候重新給新指針變量來(lái)重新分配內(nèi)存空間。
上述代碼就可以改為:
bounds_ =(int *)malloc(2 * sizeof(int)); bonuds_[0]= 0 ; bonuns_[1]= 1 ;base =(int *)malloc(2 * sizeof(int)); for (i =0 ; i< 2 ;i++){base[i]=bound_[i]; }cout<<base[0]; // 0 free(bound_); cout<<base[0]; //0深拷貝的好處就是兩個(gè)指針相互不影響,復(fù)制的指向內(nèi)存中的內(nèi)容,而不是指針變量中的地址值。
而淺拷貝問(wèn)題主要都是出現(xiàn)在? 內(nèi)存回收這一部分。C++一般是不對(duì)動(dòng)態(tài)分配的內(nèi)存進(jìn)行回收的,
C中用?malloc 分配內(nèi)存,用 free 手動(dòng)施放內(nèi)存。 C++ 用new 分配內(nèi)存,用delete 手動(dòng)施放內(nèi)存。
而在C++中有一個(gè)標(biāo)準(zhǔn)庫(kù)叫Boost 庫(kù), 其中?使用? boost::shared_ptr? 來(lái)管理new 出來(lái)的內(nèi)存時(shí),不需要手動(dòng)施放,它自己會(huì)自動(dòng)施放無(wú)用的動(dòng)態(tài)分配出來(lái)的內(nèi)存。通過(guò)對(duì)分配的內(nèi)存進(jìn)行引用計(jì)數(shù),如果分配的內(nèi)存引用計(jì)數(shù)到0時(shí),即程序沒(méi)有變量能夠指向到這塊內(nèi)存時(shí)就自動(dòng)施放。關(guān)于指針的深拷貝可以參考:
https://blog.csdn.net/superSmart_Dong/article/details/108178633
總結(jié)
以上是生活随笔為你收集整理的C++ :Signal: SIGSEGV (Segmentation fault) ,深拷贝的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C++ : KMP 字符串匹配算法
- 下一篇: C++ : 构造函数,拷贝构造函数,移动