配列や行列のような動的メモリ割り当てを使用するクラスAがあるとします。オブジェクトAの作成中に、コンストラクタを介して、どのくらいのメモリ空間が割り当てられているかを決定するパラメータが渡されます。意図した方法では作成できないオブジェクトの処理C++
class A
{
int * ptr;
int size;
void allocate() noexcept;
void destroy() noexcept;
public:
A(int) noexcept;
~A() noexept;
}
void A::destroy() noexcept
{
if(ptr!=nullptr)
delete [] ptr;
}
A::~A() noexcept
{ destroy();}
void A::allocate() try
{
ptr = new int[n];
}
catch (std::bad_alloc & ex)
{
std::cerr << ex.what();
destroy();
}
A::A(int n) noexcept : size(n) { allocate(); };
これらの種類のものは、設計上賢明ですか?意図した方法で作成できないオブジェクトはどうなりますか?それはゾンビのように「生きている」ままであろうか、それとも破壊されるだろうか?
マトリックスが複数の新しいステートメントで割り当てられるマトリックスシナリオで何をすべきか?
スマートポインタ、STLとその種のものはここではオプションではありません。
READ ME:このクラスは純粋にこの種の問題のために作られたデモンストレーションクラスです。それは0/3/5の規則に従わない。なぜなら、質問のために書くのはあまりにも多くのコードであり、この質問にとっては重要ではないからである。すでにこれらの問題に関する質問がたくさんあります。
なぜ投げるべきものを投げ捨てるのはなぜですか? – juanchopanza
なぜ失敗した割り当てで 'destroy'を呼び出すのですか?割り当てに失敗した場合は、「削除」する必要がないことを意味します。 –
"これは良い解決策ですか?" - どんな問題? –