C++ :Signal: SIGSEGV (Segmentation fault) ,深拷贝
C++在運行時出現Signal: SIGSEGV (Segmentation fault)? 問題,通常是訪問了系統給這個程序所分配以外的內存空間。從而出現段錯誤,經常在使用指針時會出現。
例如
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)因為給在base = bound 中,把bound中的所指向的地址值temp賦值給base,而在free(bound)中,把動態分配的內存temo給施放了,此時再用base來訪問temp 就會出現段錯誤,因為訪問了程序所分配的以外的內存空間。
上述 base = bound 指針之間直接賦值屬于淺拷貝,兩個指針變量所指向的是同一個內存空間。而深拷貝,就是賦值的時候重新給新指針變量來重新分配內存空間。
上述代碼就可以改為:
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深拷貝的好處就是兩個指針相互不影響,復制的指向內存中的內容,而不是指針變量中的地址值。
而淺拷貝問題主要都是出現在? 內存回收這一部分。C++一般是不對動態分配的內存進行回收的,
C中用?malloc 分配內存,用 free 手動施放內存。 C++ 用new 分配內存,用delete 手動施放內存。
而在C++中有一個標準庫叫Boost 庫, 其中?使用? boost::shared_ptr? 來管理new 出來的內存時,不需要手動施放,它自己會自動施放無用的動態分配出來的內存。通過對分配的內存進行引用計數,如果分配的內存引用計數到0時,即程序沒有變量能夠指向到這塊內存時就自動施放。關于指針的深拷貝可以參考:
https://blog.csdn.net/superSmart_Dong/article/details/108178633
總結
以上是生活随笔為你收集整理的C++ :Signal: SIGSEGV (Segmentation fault) ,深拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ : KMP 字符串匹配算法
- 下一篇: C++ : 构造函数,拷贝构造函数,移动