欢迎访问 生活随笔!

生活随笔

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

c/c++

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

发布时间:2024/10/14 c/c++ 79 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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) ,深拷贝的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。