看了书上,new的定位功能可以在你指定的地址开辟新的内存。但是貌似不用这个新功能照样也可以做到这些。
比如
int *pa=new int;
double *pa_a = (double *) pa;
这个也可以生成一个指向 pa 地址的另一个类型的指针。其地址应该也没发生变化吧?
希望有大神能解决我的疑惑。我实在是感觉new的定位功能貌似很鸡肋一样。我通过强制转换指针类型也可以做到这个需求。
以上为知乎https://www.zhihu.com/question/38230267的内容,我也感到奇怪,在工程中会用到么?
귀하께서 말씀하신 예는 기본 유형에 대한 것이며,
int
의size
가double
의size
보다 작아서 문제가 발생하기 쉽습니다placement new
의 기능은 새로운 메모리를 여는 것이 아니라, 지정된 메모리 블록에 객체를 생성하는 것입니다예:
으아악위 코드에서
의 경우 포인터 유형만 변경되었으며pb
은 새로 할당된 메모리를 가리키는 것이 아니라,pa
이 가리키는 메모리를 재사용합니다.의 생성자는
pa
이 실행된 후B
로 호출되지만 메모리의개체는
pb == pa
개체A
B
가 됩니다.sizeof(B) <= sizeof(A)
당신이 언급한의 생성자를 호출할 수 없습니다. 즉, 메모리 블록은 여전히
은 보다 효율적이고 유연한 메모리 할당 전략이 필요한 일부 상황에서 사용됩니다(예:强制类型转换
개체이지만B
은 아닙니다. 객체A
B
엔지니어링 실무에서는 일반적으로 메모리 관리에 사용됩니다.를
를 매일 사용하면 그 아래에 구현). 원래 메모리 블록을 재사용하면
内存池
및placement new
)malloc
의 빈번한 발생을 피할 수 있습니다.free
예를 들어가 사용됩니다
stl
(자세한 내용은memory allocator
를 참조하세요)placement new