0

2 つの char[] を新しい配列にマージする簡単なコードがあります。問題は、新しい配列を作成したときに、コンストラクターで割り当てられた元の char 配列を削除したいことです。このメモリで削除を呼び出さないと、m_str を再割り当てすると、メモリ リークが発生します。

-編集 delete を呼び出すとエラーが発生するのはなぜですか?

String()      { m_str = new char[1]; *m_str = 0; }

String& String::operator+= (const String& other)
{
    unsigned int tmpInt1, tmpInt2;

    tmpInt1 = myStrlen(this->m_str);
    tmpInt2 = myStrlen(other.m_str);

    // Allocate the new char array, make an extra space for the '\0'
    char* newChar = new char[tmpInt1 + tmpInt2 + 1];

    myStrcat(newChar, this->m_str, tmpInt1, 0);
    myStrcat(newChar, other.m_str, tmpInt2, tmpInt1);

    this->m_str[myStrlen(m_str)] = '\0';

    delete[] this->m_str;
    this->m_str = newChar;

    return *this;
}
4

1 に答える 1

0

リークされたメモリは、プログラム内の他の何かに再利用できないためです。プログラムを閉じてシステムが再利用できるようになるまで、使用され続けます。

ほとんどの場合、メモリは無限のリソースではないため、再利用できるようにクリーンアップする必要があります。

おそらく少量のメモリの場合、リークは大きな問題ではありませんが、一度に 256 バイトのブロックを大量に割り当てている場合、これらのリークはすぐに問題になる可能性があります。

于 2013-02-26T16:40:41.473 に答える