動的メモリ確保なしでポリモーフィズムを実装しようと思い、以下のような実装にしましたが、これは問題ないでしょうか。
C++
1 2class Base 3{ 4public: 5 virtual void f() = 0; 6 virtual ~Base() = default; 7}; 8 9class Derived1 :public Base 10{ 11 void f()override { std::cout << "Derived1" << std::endl; } 12}; 13class Derived2 :public Base 14{ 15 void f()override { std::cout << "Derived2" << std::endl; } 16}; 17 18template<typename ...Types> 19struct get_max_type_impl; 20 21template<typename MaxType> 22struct get_max_type_impl<MaxType> 23{ 24 using type = MaxType; 25 static constexpr size_t size = sizeof(MaxType); 26}; 27 28template<typename MaxType, typename Head, typename ...Tail> 29struct get_max_type_impl<MaxType, Head, Tail...> : get_max_type_impl<std::conditional_t<(sizeof(MaxType) > sizeof(Head)), MaxType, Head>, Tail... > 30{ 31}; 32 33template<typename Head, typename ...Tail> 34struct get_max_type : get_max_type_impl<Head, Tail...> 35{ 36}; 37 38int main() 39{ 40 std::byte heap[get_max_type<Derived1, Derived2>::size]; 41 Base* d = new(heap) Derived1; 42 d->f(); 43 d->~Base(); 44 d = new(heap) Derived2; 45 d->f(); 46 d->~Base(); 47} 48
main内のstd::byte型配列をメモリとしてplacement newで派生したクラスのメモリを配置しています。
これで問題がなければ利用したいのですが、どうでしょうか。
デストラクタは動かさなくていいんですよね?
デストラクタもこちらで確認しましたが、ちゃんと動作するようです。
デストラクタを動かすとなると何か問題があるのでしょうか。
placement new されたオブジェクトを delete したらメモリの開放でトラブるんじゃないかと思って。
deleteはしていません。
スタック領域のメモリのため、スコープを抜けたら勝手に解放されると思っています。
delete は使わずにデストラクタを直接呼んでるので問題ないと思います。
https://stackoverflow.com/a/14187068
とりあえず、heap を適切にアラインしてあげる必要があるのでは。
https://cpprefjp.github.io/lang/cpp11/alignas.html
delete しないってことは、デストラクタは動かんですよね?
...あ、明示的にデストラクトするのか。なら無問題か。
回答2件
あなたの回答
tips
プレビュー