3

スレッド内より

C++ で new キーワードを使用する必要があるのはいつですか?

答えは、関数からオブジェクトへのポインターを返す必要がある場合、オブジェクトへのポインターを作成するためにいつ「new」を使用する必要があるかについて語っています。

ただし、以下のコードは正常に動作します。新しいポインターにメモリを割り当てる代わりに、ローカル ポインターを使用します。

node* queue::dequeue(){
  if(head==0){
    cout<<"error: the queue is empty, can't dequeue.\n";
    return 0;
  }
  else if(head->next !=0){
    node *tmp=head;
    head=head->next;
    tmp->next=0;
    return tmp;
  }
  else if(head->next ==0){
    node *tmp=head;
    head=0;
    tmp->next=0;
    return tmp;
  }
}

これは単純な dequeue() 操作です。私の tmp はローカル ポインターです。しかし、私はまだそれを返します。

マヘシュの功績

main() に次のステートメントがあります

node a8(8); //node constructor with the value

したがって、tmp は head が指すものを指し、head は a8 のような別のノードを指します。

a8 は main() 全体で有効なので、tmp も main() 全体で有効です。

4

2 に答える 2

7

有効期間が指すメモリの場所tmpが dequeue メンバー関数の範囲を超えているため、プログラムは正常に動作します。tmpスタック上にあり、関数が戻ると寿命が終わりますが、それが指していたメモリ位置には当てはまりません。

対照的に、次のコードは安全ではありません。

int* boom()
{
    int sVar = 10;
    int *ptr = &sVar;

    return ptr;
} // life time of sVar ends here

ptr指すメモリ位置は、関数が戻るまで有効です (ただし、関数が戻った後ではありません)。

于 2013-09-10T04:18:54.263 に答える
1

この関数は、グローバル (またはクラス メンバー) ポインターのコピーであるローカル ポインターを返しますhead。ローカル変数へのポインターを返していません。大丈夫です。

于 2013-09-10T04:19:39.827 に答える