C++ placement new 用法
---源码---
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 用法相关推荐
- operator new在C++中的各种写法
乍一看,在C++中动态分配内存很简单:new是分配,delete是释放,就这么简单.然而,这篇文章讲得要复杂一点,并且要考虑到自定义层次.这也许对简单的程序并不重要,但对你在代码中控制内存却是十分必要 ...
- 吾爱IC社区一周岁了,mark下
吾爱IC社区一周岁了,mark下!(免费送书!) 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 转眼间,小编的公众号已经一岁了.对的,就是去年的今天,小编 ...
- Placement new的用法及用途
什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可. 举例来说: class foo ...
- placement new的标准用法及用途
什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可. 举例来说: class foo ...
- placement new的用法
placement new是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本 ...
- Placement new的用法及用途【转】
什么是placement new? 所谓placement new就是在用户指定的内存位置上构建新的对象,这个构建过程不需要额外分配内存,只需要调用对象的构造函数即可. 举例来说: 1 class f ...
- html table运用方法,HTML Table caption用法及代码示例
表标题属性返回表的 元素,该元素用于定义表的标题.只能将一个标题分配给一个表,并且在元素内输入的标题默认为居中对齐. 用法 tableObject.caption 以下示例程序旨在说明表caption ...
- operator new,new operator,placement new的区别
原文地址:http://www.cnblogs.com/jamesmile/archive/2010/04/17/1714311.html,在此感谢 C++中的operator new与new ope ...
- C++中placement new操作符(经典)
placement new是重载operator new的一个标准.全局的版本,它不能被自定义的版本代替(不像普通的operator new和operator delete能够被替换成用户自定义的版本 ...
最新文章
- C++:Lambda函数学习
- Spring Aop 常见注解和执行顺序
- ClickHouse 系列教程五:多种连接方法
- 开源 免费 java CMS - FreeCMS-功能说明-用户管理
- ListBox实现拖拽排序功能
- 5、play中的json数据处理
- android循环滚动textview,Android 循环上下滚动
- Hadoop核心组件及组件介绍
- 最新PHP扩展SG11解密教程分享+视频模式
- 常用的几种图片无损压缩工具
- python处理xps文件_xps/pdf/png/json转换
- 【RNNoise】用深度学习抑制噪声
- 实验代做 行人识别_实验室代做实验项目
- mysql索引一般什么数据结构_mysql索引一般使用什么数据结构
- python读取文件名包含某字符的文件_Python 在当前和子目录中查找文件名中包含指定字符串的文件...
- 【问题解决】java.lang.IllegalStateException异常是什么问题?解决办法
- CommandArgument的一种用法
- iMeta | 华南农大陈程杰/夏瑞等发布TBtools构造Circos图的简单方法
- C#如何读取身份证阅读器
- Metasploit---情报收集---被动情报收集