博客
关于我
C++ :Signal: SIGSEGV (Segmentation fault) ,深拷贝
阅读量:650 次
发布时间:2019-03-15

本文共 861 字,大约阅读时间需要 2 分钟。

C++在运行时出现Signal: SIGSEGV (Segmentation fault)  问题,通常是访问了系统给这个程序所分配以外的内存空间。从而出现段错误,经常在使用指针时会出现。

例如

bounds_ =(int *)malloc(2 * sizeof(int))bonuds_[0]= 0 ;bonuns_[1]= 1 ;base = bound;cout<

因为给在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<

深拷贝的好处就是两个指针相互不影响,复制的指向内存中的内容,而不是指针变量中的地址值。

而浅拷贝问题主要都是出现在  内存回收这一部分。C++一般是不对动态分配的内存进行回收的,

C中用 malloc 分配内存,用 free 手动施放内存。 C++ 用new 分配内存,用delete 手动施放内存。

而在C++中有一个标准库叫Boost 库, 其中 使用  boost::shared_ptr  来管理new 出来的内存时,不需要手动施放,它自己会自动施放无用的动态分配出来的内存。通过对分配的内存进行引用计数,如果分配的内存引用计数到0时,即程序没有变量能够指向到这块内存时就自动施放。关于指针的深拷贝可以参考:

转载地址:http://jtjmz.baihongyu.com/

你可能感兴趣的文章
Nacos服务部署安装
查看>>
nacos本地可以,上服务器报错
查看>>
Nacos注册Dubbo(2.7.x)以及namespace配置
查看>>
Nacos注册中心有几种调用方式?
查看>>
nacos注册失败,Feign调用失败,feign无法注入成我们的bean对象
查看>>
nacos源码 nacos注册中心1.4.x 源码 nacos源码如何下载 nacos 客户端源码下载地址 nacos discovery下载地址(一)
查看>>
nacos源码 nacos注册中心1.4.x 源码 spring cloud alibaba 的discovery做了什么 nacos客户端是如何启动的(二)
查看>>
nacos源码 nacos注册中心1.4.x 源码 如何注册服务 发送请求,nacos clinet客户端心跳 nacos 注册中心客户端如何发送的心跳 (三)
查看>>
Nacos源码分析:心跳机制、健康检查、服务发现、AP集群
查看>>
nacos看这一篇文章就够了
查看>>
Nacos简介、下载与配置持久化到Mysql
查看>>
Nacos简介和控制台服务安装
查看>>
Nacos管理界面详细介绍
查看>>
Nacos编译报错NacosException: endpoint is blank
查看>>
nacos自动刷新配置
查看>>
nacos运行报错问题之一
查看>>
Nacos部署中的一些常见问题汇总
查看>>
NACOS部署,微服务框架之NACOS-单机、集群方式部署
查看>>
Nacos配置Mysql数据库
查看>>
Nacos配置中心中配置文件的创建、微服务读取nacos配置中心
查看>>