3

状況:コンテナの先頭に格納されているconst char *をユーザーに返すPop()関数をサポートするリストのようなコンテナを実装しています。ただし、実装者として、元のconst char *を返す必要があるかどうか(コンテナからノードポインタを削除するが、const char *自体でdeleteを呼び出さない)、または新しいメモリを割り当てて要素のコピーを返します。

クラスやプロジェクトから、常にコピーを支持する人々に遭遇しました。そのため、以前に返された参照(ゲッターなどから)やconst char *へのポインターは、ポップされたバージョンを変更できませんが、このアプローチでは追加の割り当てが必要であり、 strcpy、削除せずに元の削除されていないポインタをconstcharに返すだけで本当に問題になるかどうかを尋ねたいと思いました。割り当てとコピー(および後で元の参照を削除)を使用したアプローチのコードスニペットは次のとおりです。

const char* LinkedList::PopHeadString()
{
    node* deletehead = head_;
    char* output = NULL;

    if (head_ != NULL && GetHeadType() == STRING) {
        output = new char[strlen(head_->en.data.str) + 1];
        strcpy(output, head_->en.data.str);
        head_ = head_->next;
        delete deletehead->en.data.str;
        delete deletehead;
        --nEntries_;
    }
    return output;
}

Pop()は一般的なコンテナ操作なので、一般的なアプローチは何かを尋ねたいと思いました。

4

1 に答える 1

4

コピーせずにポインタを返す場合は、ポインタの所有者を決定する必要があります。所有者は、不要になったときに削除する責任があります。これは、特にコードがより複雑になる場合、非常に難しい問題になる可能性があります。コピーセマンティクスは、推論するのがはるかに簡単です。

特定の例では、最初に変更するのは、文字列を表すstd::string代わりにを使用することです。const char *by値を返すstd::stringと、コピーが自動的に処理されます。

本当にコピーを防ぎたいが、それでもライフタイムをエレガントに管理したい場合は、std::shared_ptr<std::string>(またはboost::shared_ptr<std::string>C ++ 11コンパイラを使用していない場合)の使用を検討する必要があります。Ashared_ptrは、参照カウントを使用して、それが指すオブジェクトをいつ解放する必要があるかを判断します。これにより、手動のメモリ管理の負担がかかります。これは良い考えです。

于 2012-05-14T06:21:13.207 に答える