以下のコードは、if(m_buf)を使用して割り当てが正しく行われたかどうかを確認しています。 私は約2物事をさまよう有効な割り当てを確認する方法
char *m_buf;
void String::_copy(const char* lpsz){
if (lpsz != 0){
int len = MyCString::strlen(lpsz);
m_buf = new char[len + 1];
if (m_buf)
MyCString::strcpy(m_buf, lpsz);
}
}
(コードでは、いくつかのビデオチュートリアルからです)。
まず、本当に必要なコードですか?
第2に、new char[len+1]
が正常に実行されたかどうかを実際に確認していますか?
charポインタの何かが真であるかどうかを調べるだけです。私はC文字列ポインタは文字列の最初のメモリアドレスを持っているが、それはすべての文字列メモリアドレスについて有効ではないはずです知っている?私は何を考えているのですが、演算子newは既に例外をスローしているコードを持っています。どうしてtry catchを使わないのですか?
オブジェクトを動的に割り当てて、割り当てが正常に行われたことを確認したいとします。あなたならどうしますか?私がオブジェクトを作るたびにこれを行うべきだと思いますか?
'new'は失敗した場合に例外をスローします。したがって、このチェックは冗長です。 –
"すべての文字列のメモリアドレスについて有効であってはいけません"は、IMOの基本的な理解の欠如を示しています。ポインタは単一の値で、メモリブロックの**開始アドレス**を示します。開始アドレスが有効である(つまり、プログラムのメモリの境界内にある)ことがわかると、ブロック内のすべてのアドレスをチェックする意味がありません。もちろん、これはすべて、ブロックが正しく割り当てられていることを前提としています。 –
ところで:ちょうどあなたが学んでいるなら、それは大丈夫ですが、独自の文字列クラス/関数をロールするのは良い考えではないことに注意してください。 'std :: string'を使うと、メモリリークや' new'などを心配する必要はありません。 – szczurcio