คำถามติดแท็ก placement-new

22
มีประโยชน์อะไรบ้างสำหรับ "การจัดวางใหม่"
มีใครที่นี่เคยใช้ "ตำแหน่งใหม่" ของ C ++ หรือไม่ ถ้าใช่มีไว้เพื่ออะไร ดูเหมือนว่าฉันจะเป็นประโยชน์กับฮาร์ดแวร์ที่แมปหน่วยความจำเท่านั้น

2
จะปลอดภัยไหมที่จะเรียกตำแหน่งใหม่บน "นี่" สำหรับวัตถุที่ไม่สำคัญ?
ฉันรู้ว่าคำถามนี้ถูกถามหลายครั้งแล้ว แต่ฉันไม่สามารถหาคำตอบสำหรับกรณีนี้โดยเฉพาะ สมมติว่าฉันมีชั้นเรียนที่ไม่สำคัญซึ่งไม่ได้เป็นเจ้าของทรัพยากรใด ๆ และมีตัวทำลายที่ว่างเปล่าและตัวสร้างเริ่มต้น มันมีตัวแปรสมาชิกจำนวนหนึ่งที่มีการเริ่มต้นในคลาส constไม่ได้เป็นหนึ่งในนั้นคือ ฉันต้องการเริ่มต้นใหม่และวัตถุของชั้นเรียนดังกล่าวโดยไม่ต้องเขียนdeInitวิธีด้วยมือ ปลอดภัยไหมที่จะทำอย่างนี้? void A::deInit() { new (this)A{}; } ฉันไม่เห็นปัญหาใด ๆ กับวัตถุ - วัตถุอยู่ในสถานะที่ถูกต้องเสมอthisชี้ไปยังที่อยู่เดียวกัน แต่มันคือ C ++ ดังนั้นฉันต้องการแน่ใจ

2
การเปลี่ยนแปลงเกี่ยวกับชุดรูปแบบการสะกดคำแบบพิมพ์: การสร้างสิ่งเล็กน้อยในสถานที่
ฉันรู้ว่านี่เป็นเรื่องที่ค่อนข้างทั่วไป แต่เท่าที่ UB ทั่วไปหาได้ง่ายฉันไม่พบตัวแปรนี้จนถึงตอนนี้ ดังนั้นฉันจึงพยายามแนะนำวัตถุพิกเซลอย่างเป็นทางการในขณะที่หลีกเลี่ยงการคัดลอกข้อมูลจริง ถูกต้องหรือไม่ struct Pixel { uint8_t red; uint8_t green; uint8_t blue; uint8_t alpha; }; static_assert(std::is_trivial_v<Pixel>); Pixel* promote(std::byte* data, std::size_t count) { Pixel * const result = reinterpret_cast<Pixel*>(data); while (count-- > 0) { new (data) Pixel{ std::to_integer<uint8_t>(data[0]), std::to_integer<uint8_t>(data[1]), std::to_integer<uint8_t>(data[2]), std::to_integer<uint8_t>(data[3]) }; data += sizeof(Pixel); } return result; …

1
ใหม่ (นี่) ThisClass () เป็นความคิดที่ไม่ดีหรือไม่?
class FooView final : public Something { ... void refresh() { this->~FooView(); new (this) FooView(); } } ฉันไม่เคยเห็นสำนวนนี้และดูเหมือนว่ามันจะบอบบางและยุ่งเหยิงจริง ๆ แต่ฉันไม่สามารถคิดถึงปัญหากับมันFooViewได้ นี่เป็นความคิดที่ไม่ดีเหรอ?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.