共享内存结构与指针问题
2014-04-23 17:54
288 查看
【问题】在开发项目中自定义了包含指针的共享内存结构体,运行时异常导致程序崩溃。
共享内存结构体定义(伪代码):
定义这个结构体本意是想在共享内存中构造对象并共享之(伪代码):
这样编码看起来没有问题,但是运行很可能出错。
分析问题根源: 共享内存被映射到每个进程的起始地址可能不同,影响了从共享内存中读取的对象指针无法找到对象,
导致调用未知对象上的方法运行时错误。解决办法: 重新定义共享内存结构体,将对象指针改为对象(伪代码):
问题解决,运行正常。 : )
共享内存结构体定义(伪代码):
struct shared_mem_buffer { shared_mem_buffer () : read_sem_ (0) , write_sem_ (1) , mutex_sem_ (1) { } ipc_semaphore read_sem_; ipc_semaphore write_sem_; ipc_semaphore mutex_sem_; ipc_protocol *pkt_; /* packet pointer */ }*sb_;
定义这个结构体本意是想在共享内存中构造对象并共享之(伪代码):
sb_->pkt_ = new (shm_start_addr + sizeof (shared_mem_buffer))ipc_protocol; /* shm_start_addr 是共享内存映射到进程的起始地址 */
这样编码看起来没有问题,但是运行很可能出错。
分析问题根源: 共享内存被映射到每个进程的起始地址可能不同,影响了从共享内存中读取的对象指针无法找到对象,
导致调用未知对象上的方法运行时错误。解决办法: 重新定义共享内存结构体,将对象指针改为对象(伪代码):
struct shared_mem_buffer { shared_mem_buffer () : read_sem_ (0) , write_sem_ (1) , mutex_sem_ (1) { } ipc_semaphore read_sem_; ipc_semaphore write_sem_; ipc_semaphore mutex_sem_; ipc_protocol pkt_; /* packet object */ }*sb_;
问题解决,运行正常。 : )
相关文章推荐
- mongo对象var_dump的时候无法显示更多数据的处理办法
- [ios 开发笔记]:一句话笔记
- NYOJ17 单调递增最长子序列 【二分法】+【动态规划】
- 写在最初
- MFC CString的用法
- 虽然看的一知半解,但是感觉有一天用到时会很有用,转
- LAMP(Linux+Apache+Mysql+PHP)环境搭建
- eclipse 导入 WEB项目不识别
- Java注解学习和应用
- struts2 CRUD
- Chrome 编译,调试,远程调试,杂谈
- COJ - 1049 - Sum 题解
- java:hibernate + oracle之坑爹的clob
- ADT下载地址整理(转)
- HTTP请求-配置-POST请求-GET请求
- xcode代码本地管理
- 共轭对称序列和共轭反对称序列
- 某坑爹公司的笔记_Day06-Day11
- 点滴
- linux汇编详解