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