c++ - 【转自知乎】关于new的定位功能(placement new),这个功能是不是多余的?
伊谢尔伦
伊谢尔伦 2017-04-17 15:22:05
0
1
683

看了书上,new的定位功能可以在你指定的地址开辟新的内存。但是貌似不用这个新功能照样也可以做到这些。
比如

int *pa=new int;
double *pa_a = (double *) pa;

这个也可以生成一个指向 pa 地址的另一个类型的指针。其地址应该也没发生变化吧?
希望有大神能解决我的疑惑。我实在是感觉new的定位功能貌似很鸡肋一样。我通过强制转换指针类型也可以做到这个需求。

以上为知乎https://www.zhihu.com/question/38230267的内容,我也感到奇怪,在工程中会用到么?

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

모든 응답(1)
PHPzhong

귀하께서 말씀하신 예는 기본 유형에 대한 것이며, intsizedoublesize보다 작아서 문제가 발생하기 쉽습니다

placement new의 기능은 새로운 메모리를 여는 것이 아니라, 지정된 메모리 블록에 객체를 생성하는 것입니다

예:

으아악

위 코드에서 pb은 새로 할당된 메모리를 가리키는 것이 아니라, pa이 가리키는 메모리를 재사용합니다.
의 생성자는 pa이 실행된 후 B로 호출되지만 메모리의
개체는 pb == pa 개체 AB가 됩니다.
sizeof(B) <= sizeof(A) 당신이 언급한

의 경우 포인터 유형만 변경되었으며

의 생성자를 호출할 수 없습니다. 즉, 메모리 블록은 여전히 ​​强制类型转换 개체이지만 B은 아닙니다. 객체A B엔지니어링 실무에서는 일반적으로 메모리 관리에 사용됩니다.

은 보다 효율적이고 유연한 메모리 할당 전략이 필요한 일부 상황에서 사용됩니다(예:


에 구현). 원래 메모리 블록을 재사용하면 内存池placement new) malloc의 빈번한 발생을 피할 수 있습니다. free예를 들어

를 매일 사용하면 그 아래

가 사용됩니다stl(자세한 내용은 memory allocator를 참조하세요) placement new

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿