---源码---
struct Student
{
    string name;
    int age;
};
//创建共享内存的ID
#define MEM_ID    1234
//映射共享内存的大小,3个Student大小长
#define MEM_SIZE sizeof(Student)*3

//共享内存读取端
int main(void)
{
    //打开共享内存
    int shmid = shmget(MEM_ID, MEM_SIZE, IPC_CREAT | IPC_EXCL | 0666);
    if (shmid == -1)
        err_exit("shmget");
    //映射共享内存,使用常量指针防止地址丢失
    Student * const cpstu = (Student*)shmat(shmid, NULL, 0);
    
    if (cpstu == reinterpret_cast<void*>(-1))
        err_exit("shmat");
    //访问数据
    Student *pstu = cpstu;
    //error:一旦访问string必出现段错误。
    printf("idx:%d,name:%s,age:%d\n",0, pstu[0].name.c_str(), pstu[0].age);
        ......
---end----

问题描述:
每次访问Student对象中的string成员就会导致段错误。

问题分析:
根本原因在于,string字符串必须要使用默认的构造函数才能正确使用
所以,当直接使用共享内存作为string时,就会出现错误!
实际上,不只是共享内存,使用malloc分配的内存来作为string使用时,也会导致相同的错误
只用使用new构建Student对象,或者直接在栈空间中定义Student对象,或者定义全局Student对象时,
这几种情况下,都会调用默认的构造函数来构建string对象。

解决方案:
使用placement new(在指定的地址分配内存并构建对象)
使用:Student *pstu = new(cpstu)(Student[3]);

C++ placement new 用法相关推荐

  1. operator new在C++中的各种写法

    乍一看,在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单.然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次.这也许对简单的程序并不重要,但对你在代码中控制内存却是十分必要 ...

  2. 吾爱IC社区一周岁了,mark下

    吾爱IC社区一周岁了,mark下!(免费送书!) 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 转眼间,小编的公众号已经一岁了.对的,就是去年的今天,小编 ...

  3. Placement new的用法及用途

    什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可. 举例来说: class foo ...

  4. placement new的标准用法及用途

    什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可. 举例来说: class foo ...

  5. placement new的用法

    placement new是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本 ...

  6. Placement new的用法及用途【转】

    什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可. 举例来说: 1 class f ...

  7. html table运用方法,HTML Table caption用法及代码示例

    表标题属性返回表的 元素,该元素用于定义表的标题.只能将一个标题分配给一个表,并且在元素内输入的标题默认为居中对齐. 用法 tableObject.caption 以下示例程序旨在说明表caption ...

  8. operator new,new operator,placement new的区别

    原文地址:http://www.cnblogs.com/jamesmile/archive/2010/04/17/1714311.html,在此感谢 C++中的operator new与new ope ...

  9. C++中placement new操作符(经典)

    placement new是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本 ...

最新文章

  1. C++:Lambda函数学习
  2. Spring Aop 常见注解和执行顺序
  3. ClickHouse 系列教程五:多种连接方法
  4. 开源 免费 java CMS - FreeCMS-功能说明-用户管理
  5. ListBox实现拖拽排序功能
  6. 5、play中的json数据处理
  7. android循环滚动textview,Android 循环上下滚动
  8. Hadoop核心组件及组件介绍
  9. 最新PHP扩展SG11解密教程分享+视频模式
  10. 常用的几种图片无损压缩工具
  11. python处理xps文件_xps/pdf/png/json转换
  12. 【RNNoise】用深度学习抑制噪声
  13. 实验代做 行人识别_实验室代做实验项目
  14. mysql索引一般什么数据结构_mysql索引一般使用什么数据结构
  15. python读取文件名包含某字符的文件_Python 在当前和子目录中查找文件名中包含指定字符串的文件...
  16. 【问题解决】java.lang.IllegalStateException异常是什么问题?解决办法
  17. CommandArgument的一种用法
  18. iMeta | 华南农大陈程杰/夏瑞等发布TBtools构造Circos图的简单方法
  19. C#如何读取身份证阅读器
  20. Metasploit---情报收集---被动情报收集

热门文章

  1. 华为鸿蒙系统的技术特性,华为鸿蒙系统来了,还有这四大技术特性
  2. canvas——实现图片验证码(功能实现)
  3. java 循环字母_java循环26个字母
  4. MySQL权限篇之SHOW DATABASES及SHOW VIEW
  5. Billboard(海报粘贴简单的线段树)
  6. 2010年4月2日 晴
  7. 网上流传ldquo;魔方文化启示录rdquo;
  8. 【职场攻略】送礼给老板有讲究
  9. flying saucer做导PDF踩过的坑~
  10. 回顾马云屌丝岁月的惨状:多次被拒失声痛哭