关于placement new复用存储与数组生存期的技术问询
关于placement new复用存储与数组生存期的技术问询
咱们来把这个问题拆解得明明白白:
首先直接给核心结论:这段代码里的第二行不会结束整个数组arr的生存期,也算不上是“复用整个数组存储”——它只是替换了数组中单个元素的对象,同时终止了那个旧元素的生存期。
具体原因可以分成两点来看:
数组整体的生存期规则
数组对象arr作为一个包含42个T的整体对象,它的生存期只有在调用delete[] arr(或者其底层存储被系统回收/重新分配)时才会结束。你这里只是在数组的第4个元素(arr+3指向的位置)上用placement new创建了新的T对象,这只会让原来在这个位置的旧T元素“寿终正寝”,但数组的其他41个元素依然正常存活,数组本身的整体生存期完全不受影响。“存储复用”的正确场景
如果你想复用整个数组的存储,你需要先终止整个数组的生存期(比如手动销毁所有元素后释放存储,或者直接在整个数组的存储位置上创建全新的对象),但这里的代码只操作了单个元素的位置。而且对于非std::byte/unsigned char的类型来说,每个数组元素都是独立的对象,替换单个元素只是针对该位置的对象进行重新构造,和“复用整个数组存储”根本不是一个概念。
最后补个重要细节:用placement new在已有同类型对象的存储位置创建新对象是符合C++标准的,但如果T有非平凡的析构函数,一定要记得手动调用旧元素的析构函数(比如(arr+3)->~T();),否则很容易造成资源泄漏哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

