placement new[]是有毒的

ID870177103 2017-10-07 12:39:31
对于non-pod类型返回的地址不一样 https://stackoverflow.com/questions/21441245/operator-new-and-non-pod-types
...全文
879 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
xskxzr 2017-10-15
  • 打赏
  • 举报
回复
引用 12 楼 ID870177103 的回复:
[quote=引用 8 楼 xsklld 的回复:] [quote=引用 7 楼 ID870177103 的回复:] [quote=引用 6 楼 xsklld 的回复:] [quote=引用 2 楼 ID870177103 的回复:] [quote=引用 1 楼 xsklld的回复:]跟placement new有什么关系?
简单来说就是 memory_pool mp ; auto a = mp.alloc (3 * sizeof (int)) ; auto b = new (&a) int[3] ; assert (a == b) ; 这段代码没毛病 不过把int换成non-pod类型 断言就是失败[/quote] 为啥要assert a==b呢?[/quote] 兄弟,你把int换成std::string,然后去掉assert,开debug跑一下,你就会发现问题了[/quote] 我是说为啥要强行让a等于b?[/quote] [/quote] 你把tmp申请大一点不就好了?
ID870177103 2017-10-12
  • 打赏
  • 举报
回复
引用 13 楼 D41D8CD98F的回复:
placement new[] 确实是有毒的 不过如果是遵守 Itanium ABI 的编译器,比如 GCC,就不会出问题 https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies: No cookie is required if the new operator being used is ::operator new[](size_t, void*).
确实,我用g++4.8没有问题 而且在地址对齐方面g++也和vs有区别
ID870177103 2017-10-12
  • 打赏
  • 举报
回复
引用 15 楼 codedoctor的回复:
而且,的确如你所说,placement new[]是存在很大的问题的,所以你想用的话,最好还是挨个的用placement new 去构造对象,然后用对象指针进行管理,这样不仅方便构造,也方便析构
额,现在就是用的这个 我函数里面加scope guard,来防止异常 然后看起来怪怪的
codedoctor 2017-10-11
  • 打赏
  • 举报
回复
而且,的确如你所说,placement new[]是存在很大的问题的,所以你想用的话,最好还是挨个的用placement new 去构造对象,然后用对象指针进行管理,这样不仅方便构造,也方便析构
D41D8CD98F 2017-10-11
  • 打赏
  • 举报
回复
placement new[] 确实是有毒的 不过如果是遵守 Itanium ABI 的编译器,比如 GCC,就不会出问题 https://itanium-cxx-abi.github.io/cxx-abi/abi.html#array-cookies: No cookie is required if the new operator being used is ::operator new[](size_t, void*).
codedoctor 2017-10-11
  • 打赏
  • 举报
回复
引用 11 楼 ID870177103 的回复:
[quote=引用 10 楼 codedoctor 的回复:] 你那样会导致内存溢出。
是的,而且在x64上要留8byte,我想要问的是这个是标准吗?还是说编译器执行的规范[/quote] 编译器的规范,不同的编译器实现的方式有所不同。
ID870177103 2017-10-11
  • 打赏
  • 举报
回复
引用 8 楼 xsklld 的回复:
[quote=引用 7 楼 ID870177103 的回复:] [quote=引用 6 楼 xsklld 的回复:] [quote=引用 2 楼 ID870177103 的回复:] [quote=引用 1 楼 xsklld的回复:]跟placement new有什么关系?
简单来说就是 memory_pool mp ; auto a = mp.alloc (3 * sizeof (int)) ; auto b = new (&a) int[3] ; assert (a == b) ; 这段代码没毛病 不过把int换成non-pod类型 断言就是失败[/quote] 为啥要assert a==b呢?[/quote] 兄弟,你把int换成std::string,然后去掉assert,开debug跑一下,你就会发现问题了[/quote] 我是说为啥要强行让a等于b?[/quote]
ID870177103 2017-10-11
  • 打赏
  • 举报
回复
引用 10 楼 codedoctor 的回复:
你那样会导致内存溢出。
是的,而且在x64上要留8byte,我想要问的是这个是标准吗?还是说编译器执行的规范
codedoctor 2017-10-11
  • 打赏
  • 举报
回复
你那样会导致内存溢出。
codedoctor 2017-10-11
  • 打赏
  • 举报
回复
兄弟,这个问题,非常简单。 因为对于含有显式的构造和析构函数的对象来说,编译器会在placement new的时候在对象数组前面放入一个int类型大小的数字标识有当前正有多少个对象被构建,以便于后面能够完整的析构,测试代码如下:
//测试
class A {
public:
	A() { };
	~A() {};
};

int main() 
{
	auto a = malloc(4 * sizeof(A));
	auto b = new (a) A[4];
	cout << (int)a << endl;
	cout << (int)b << endl;
	cout << *(((int*)b)-1) << endl;
	system("pause"); 
	return 0;
}
输出如下:
15764912
15764916
4
所以你应该多分配四个字节,OVER 具体可以看我的博客【C++】 深入探究 new 和 delete
xskxzr 2017-10-09
  • 打赏
  • 举报
回复
引用 2 楼 ID870177103 的回复:
[quote=引用 1 楼 xsklld的回复:]跟placement new有什么关系?
简单来说就是 memory_pool mp ; auto a = mp.alloc (3 * sizeof (int)) ; auto b = new (&a) int[3] ; assert (a == b) ; 这段代码没毛病 不过把int换成non-pod类型 断言就是失败[/quote] 为啥要assert a==b呢?
xskxzr 2017-10-09
  • 打赏
  • 举报
回复
引用 7 楼 ID870177103 的回复:
[quote=引用 6 楼 xsklld 的回复:] [quote=引用 2 楼 ID870177103 的回复:] [quote=引用 1 楼 xsklld的回复:]跟placement new有什么关系?
简单来说就是 memory_pool mp ; auto a = mp.alloc (3 * sizeof (int)) ; auto b = new (&a) int[3] ; assert (a == b) ; 这段代码没毛病 不过把int换成non-pod类型 断言就是失败[/quote] 为啥要assert a==b呢?[/quote] 兄弟,你把int换成std::string,然后去掉assert,开debug跑一下,你就会发现问题了[/quote] 我是说为啥要强行让a等于b?
ID870177103 2017-10-09
  • 打赏
  • 举报
回复
引用 6 楼 xsklld 的回复:
[quote=引用 2 楼 ID870177103 的回复:] [quote=引用 1 楼 xsklld的回复:]跟placement new有什么关系?
简单来说就是 memory_pool mp ; auto a = mp.alloc (3 * sizeof (int)) ; auto b = new (&a) int[3] ; assert (a == b) ; 这段代码没毛病 不过把int换成non-pod类型 断言就是失败[/quote] 为啥要assert a==b呢?[/quote] 兄弟,你把int换成std::string,然后去掉assert,开debug跑一下,你就会发现问题了
真相重于对错 2017-10-08
  • 打赏
  • 举报
回复
一下来源自网络----- 传递给“placement new”操作符的指针所指向的内存区域必须足够大,并且可能需要为所创建的对象进行边界调整。编译器和运行时系统都不会进行任何的尝试来检查你做的是否正确。如果 类需要将边界调整为4字节,而你提供的位置没有进行边界调整的话,你就会亲手制造一个严重的灾难(如果你不明白“边界调整”的意思,那么就不要使用placement new语法)。
ID870177103 2017-10-08
  • 打赏
  • 举报
回复
引用 4 楼 倦怠的回复:
一下来源自网络----- 传递给“placement new”操作符的指针所指向的内存区域必须足够大,并且可能需要为所创建的对象进行边界调整。编译器和运行时系统都不会进行任何的尝试来检查你做的是否正确。如果 类需要将边界调整为4字节,而你提供的位置没有进行边界调整的话,你就会亲手制造一个严重的灾难(如果你不明白“边界调整”的意思,那么就不要使用placement new语法)。
哦,学到了 虽然和placement new[]的问题不是一个原因 placement new[]保留了一个机器字的地址 应该是 用于有一次构造函数发生异常时 确认哪些类已经完成构造 但是如果确实想要明确阻止编译器对placement new进行进行对齐 我应该怎么做 虽然我现在使用 new (this) T 或者 char data[sizeof(T)] new (&data) T 还没遇到过问题
ID870177103 2017-10-07
  • 打赏
  • 举报
回复
上面打错字是new (a) int[3] ; a就是指针
ID870177103 2017-10-07
  • 打赏
  • 举报
回复
引用 1 楼 xsklld的回复:
跟placement new有什么关系?
简单来说就是 memory_pool mp ; auto a = mp.alloc (3 * sizeof (int)) ; auto b = new (&a) int[3] ; assert (a == b) ; 这段代码没毛病 不过把int换成non-pod类型 断言就是失败
xskxzr 2017-10-07
  • 打赏
  • 举报
回复
跟placement new有什么关系?
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 "ZV-1 高级功能使用手册 用户详细指南" 此文档将全面阐述 Sony ZV-1 相机的进阶功能及其操作方法,为用户呈现详尽的操作指引和配置范例。 一、使用指南与摄影技巧 * 本手册旨在协助用户迅速掌握 Sony ZV-1 相机的使用方法 * 提供摄影技巧与操作方法等实用信息 * 可在线查阅配件兼容性详情及配置范例 二、基础操作 * 通过控制轮和菜单选项将常用功能分配至按键 * 探索功能按钮(Fn)与自定义按键的应用 * 学习显示(DISP)按钮的操作方法 * 明确拍摄及浏览时图标与提示的展示方式 三、电源与存储介质 * 查询电池续航时间及可拍摄照片数量 * 注意电池使用规范及更换事项 * 掌握存储卡插入方法及注意事项 四、语言与时间设定 * 说明语言及时间配置流程 * 熟悉相机内部功能说明和拍摄模式选择 五、拍摄模式与对焦系统 * 探究拍摄模式和对焦模式的选择 * 了解自动对焦、人脸/眼部自动对焦设置及主体追踪功能 * 掌握手动对焦和直接手动对焦(DMF)操作 * 理解峰值对焦设置及拍摄模式选择 六、触控操作与视频录制 * 阐明触控功能特性及触控快门使用 * 学习触控对焦与触控追踪功能 * 掌握视频录制模式及高帧速率(HFR)设置 * 了解智能自动与场景识别程序 七、曝光调整与白平衡 * 熟悉曝光模式和白平衡配置 * 探究ISO感光度调节与变焦功能 * 学习自动HDR及动态范围优化(DRO)技术 八、图像处理与编辑功能 * 明确图像质量与文件格式选项 * 了解美肤效果与自动构图功能 * 掌握色彩空间选择与快门速度设置 * 探索降噪处理及高ISO降噪技术 九、闪光灯与人脸识...
内容概要:本文围绕“重磅粉丝福利专栏1.8配电网分布式能源的选址与定容系列”展开,系统涵盖了电力系统与智能优化领域的多项前沿科研主题,重点聚焦于配电网中分布式能源的规划与优化问题。内容涉及三相PWM换流器建模、微电网控制、电动汽车有序充电、风光储协同调度、源网荷储一体化优化、双层优化与ADMM分布式算法等核心技术,并结合Matlab/Simulink仿真工具实现多种复杂场景的建模与求解。文档列举了大量具体研究案例,如基于粒子群算法的参数辨识、多目标路径规划、需求响应下的供电能力评估等,突出其在科研复现、算法创新与工程应用中的实用价值。整体资源体系庞大,强调“借力科研”,倡导通过成熟工具与方法提升研究效率与创新能力。; 适合人群:具备一定电力系统、自动化或相关工程背景,熟悉Matlab/Simulink环境,从事科研工作1-3年的研究生、科研人员或工程师。; 使用场景及目标:①用于复现高水平论文(如硕士、博士论文及EI期刊)中的算法与仿真模型;②支持科研项目中关于分布式能源规划、微电网优化、智能调度与控制策略的设计与验证;③辅助完成课程设计、毕业设计或科研竞赛中的仿真建模任务。; 阅读建议:建议读者按照文档提供的目录结构系统性浏览,优先关注与自身研究方向匹配的模块,结合提供的代码资源与仿真模型进行实践操作,注重理论分析与仿真实现的结合,以提升科研效率与创新能力。
内容概要:本文针对不对称电网故障下T型三电平逆变器的低电压穿越(LVRT)问题,提出了一种多目标协同控制策略。该策略深度融合正负序分离技术、电网电压前馈控制与先进的DPWMA调制方法,构建了完整的控制系统架构,旨在实现故障期间负序电流的有效抑制、并网功率的平稳输出以及动态响应速度的显著提升。研究通过Simulink平台建立了详细的T型三电平逆变器仿真模型,对所提控制策略在稳态运行、电网电压不平衡跌落及动态切换等多种工况下的性能进行了全面验证。仿真结果表明,该方案能有效改善并网电流质量,减小功率波动,增强系统在恶劣电网条件下的运行稳定性与鲁棒性,为高比例新能源接入背景下提升电力电子设备的故障穿越能力提供了有效的技术路径。; 适合人群:具备电力电子与电力系统基础知识,从事新能源并网、逆变器控制或微电网技术研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①研究T型三电平逆变器在不对称电网故障下的动态行为与控制难点;②掌握正负序分离、DPWMA调制、电网前馈等关键技术的设计与实现方法;③为高比例新能源接入背景下提升并网设备低电压穿越能力提供理论支持与仿真验证手段; 阅读建议:建议结合Simulink仿真模型同步学习,重点关注控制策略的结构设计与各模块间的协同机制,深入理解正负序解耦控制与前馈补偿对系统性能的提升作用,并可通过调整故障条件进行对比实验以加深理解。

65,213

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧