1

私は自分の C++ スキルを磨こうとしていました。私は2つの機能を持っています:

concat_HeapVal()出力ヒープ変数を値で
concat_HeapRef()返します 出力ヒープ変数を参照で返します

main() が実行されると、スタック上にあり、s1 と s2 がスタック上にあり、ref のみで値を渡し、以下の各関数で、ヒープに変数を作成してそれらを連結します。

concat_HeapVal() が呼び出されると、正しい出力が返されます。
concat_HeapRef() が呼び出されると、メモリ アドレスが返されます (間違った出力)。なんで?

両方の関数で new 演算子を使用します。したがって、ヒープに割り当てます。
したがって、参照によって戻ると、main() スタック メモリが範囲外になっても、ヒープは引き続き有効です。

したがって、メモリのクリーンアップはOSに任されています。右?

string& concat_HeapRef(const string& s1, const string& s2)
{

    string *temp = new string();
    temp->append(s1);

    temp->append(s2);
    return *temp;
}


string* concat_HeapVal(const string& s1, const string& s2)
{

    string *temp = new string();
    temp->append(s1);

    temp->append(s2);
    return temp;

}

int main()

{

    string s1,s2;
    string heapOPRef;
    string *heapOPVal;
    cout<<"String Conact Experimentations\n";
    cout<<"Enter s-1 : ";
    cin>>s1;
    cout<<"Enter s-2 : ";

    cin>>s2;

    heapOPRef = concat_HeapRef(s1,s2);
    heapOPVal = concat_HeapVal(s1,s2);

    cout<<heapOPRef<<"  "<<heapOPVal<<" "<<endl;
        return -9;
}
4

3 に答える 3

1

参照によって戻るときは、(とりわけ) 呼び出し元がデータの所有者にならず、データを解放する責任がないことを意味します。

新しいブロックを割り当てましたが、それへの唯一の残りの参照は、返されたものです。したがって、参照することはできません。

ただし、すべてのヒープ割り当てブロックに適用されるわけではありません。デストラクタなどで後で解放されるメンバ変数にポインタを保持するヒープ割り当てブロックがある場合、参照によってそれを返すことがよくあります。


しかし、実際には、へのポインタstd::stringはコードの匂いです。std::stringほとんどの場合、 value で返される必要があります。つまりstringstring *値ではなくポインターによるものです。

于 2013-11-04T09:13:10.400 に答える