日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

C++ :Signal: SIGSEGV (Segmentation fault) ,深拷贝

發布時間:2024/10/14 c/c++ 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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) ,深拷贝的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。