2

そのように割り当てた後、クラスメンバーの値を取得するのに問題があります:

bool ModeData::setPasswd(char* _pass)
{
    return (this->setString(this->passwd_, _pass) ? true : false);
}

bool ModeData::setOutput(char* _out)
{
    return (this->setString(this->output_, _out) ? true : false);
}

setString は次のようなものです。

bool ModeData::setString(char* _toStr, char* _fromStr)
{
    // check if already exists and delete
    this->delIfPresent(_toStr);

    // allocate space for the new string
    _toStr = new char[strlen(_fromStr) + 1];

    // copy new string
    if(strcpy(_toStr, _fromStr))
    {
        return true;
    }

    // if something gone wrong return 'false'
    return false;
}

そして、this->passwd_ の値を出力したい場合、何も得られません。メソッドを通過するときにどこかでポインタが失われていると思いますが、よくわかりません。

4

1 に答える 1

3

参照でポインターを渡す必要があります...いいえ、いいえ! 少々お待ちください。ポインターを使用しないでくださいstd::string。代わりに使用する必要があります。それはあなたの人生をとても楽にしてくれます。

これは、本当にポインターを使用したい場合、問題はそれらを値で渡していることです。これらのポインターに加えられた変更 (特に、 の代入_toStr = new char[strlen(_fromStr) + 1];) は、関数が戻ると、呼び出し元には表示されません。また、副作用として、プログラムでメモリ リークが発生します。

これを修正するには、ポインターを参照で渡します。

    bool ModeData::setString(char*& _toStr, char*& _fromStr)
//                                ^              ^

delete[]で割り当てられた配列を忘れないでください。そうしないnew[]と、メモリリークが発生します。しかし、もう一度アドバイスをさせてくださいstd::string。生のポインターを使用して手動でメモリ管理を行う代わりに、を使用してください。

于 2013-03-30T17:27:52.380 に答える