0

C++ std::string に関連する答えが見つからないようで、それが new でどのようにインスタンス化されるかという、かなり単純な質問があります。さて、メモリリークを防ぐために、 new から返されたポインタは後で削除する必要があることをよく知っています。私の質問は、既存のポインターを使用して新しい文字列オブジェクトをインスタンス化するとどうなるかということです。次の単純化された例を検討してください。

char* foo() {
    char* ptr;

    ptr = new char[ARBITRARY_VALUE];
    ...
    ptr = strncpy("some null terminated string", ARBITRARY_VALUE)
    ...
    return ptr;
}

int main() {

    char* buf;
    std::string myStr;

    buf = foo();
    myStr = new std::string(buf);

    ...do stuff

    delete myStr;
    delete buf;         //Is this necessary?
    return 0;
}

私の質問は簡単です: myStr を削除すると、buf によって使用される基になるメモリも解放されますか、それとも buf も手動で解放する必要がありますか? buf を手動で解放する必要がある場合、匿名パラメーターの場合はどうなりますか? 次のように:

myStr = new std::string(foo());

私の疑いでは、 std::string の基になる実装は文字バッファーへのポインターのみを保持し、破壊時にそのポインターを解放しますが、確信が持てず、私の C++ はせいぜい錆びています。

おまけの質問: 問題のクラスが std::string 以外の場合、これはどのように変化しますか? ユーザーが作成したクラスについては、実装者が明示的なデストラクタを提供する必要があると思いますが、他のさまざまな標準クラスはどうですか? 親オブジェクトの削除は常にオブジェクトを完全に破壊するのに十分であると仮定しても安全ですか?しかし、それはこの質問の範囲を超えています)?

4

1 に答える 1

1

std::stringC スタイルのヌル終了文字列 ( const char *) から初期化できます。そのd が必要か、d が必要か、どちらも必要ないかstd::stringを知る方法はありません。すでに述べたように、必要ありません。const char * free()delete[]()

動的に割り当てられたオブジェクトを自動的に削除するには、スマート ポインターを使用します。これらにはいくつかの種類があり、それぞれが特定の目的に特化しています。scoped_ptrauto_ptrおよびをご覧くださいshared_ptr。プロジェクトには、使用できるスマート ポインターに関する制約がある可能性があります。

C++ のコンテキストでは、手動で宣言された char 配列に文字列を保持する理由はなく、std::string使用する方がはるかに安全です。

于 2013-08-23T20:58:11.397 に答える