0

スマート ポインターに関するいくつかのガイドを読みましたが、そのコツは理解できたと思います (しゃれた意図はありません) が、それでも気になることがあります。

スマート ポインターは、new を使用してヒープ上に割り当てられたデータへのポインターを操作することを目的としています。スマート ポインターがスコープ外になると、デストラクタはポインターが指す情報の割り当てを解除します。しかし、私がミスを犯し、スマート ポインターがヒープではなくスタックに割り当てられたオブジェクトを指すようにしたとします。この場合、スタック オブジェクトで削除を使用しようとするため、厄介なセグメンテーション違反エラーが発生します。

問題を説明するために、2 つのコード スニペットを次に示します。このデモンストレーションでは、この実装をスマート ポインターに使用しました。まずはスマートポインターの正しい使い方

int main(void)
{
  int my_num = 17;
  int *p = new int(my_num);
  MyAuto_Ptr<int> p2(p);

  return 0;
}

これはバグのあるバージョンで、スタック オブジェクトへのポインターがあり、セグメンテーション フォールトが発生します。

int main(void)
{
  int my_num = 17;
  int *p = &my_num;
  MyAuto_Ptr<int> p2(p);

  return 0;
}

スマート ポインターがスタック オブジェクトを指している場合にユーザーに警告する方法はありますか?

4

1 に答える 1

3

まずはスマートポインターの正しい使い方

いいえ、これはスマート ポインターの適切な使用方法ではありません。

スマート ポインターを使用するという全体的な考え方は、そもそも「生の」ポインターを作成しないということです。したがって、適切な方法は次のようになります。

 MyAuto_ptr<int> p(new int(my_num));

スマート ポインターがスタック オブジェクトを指している場合にユーザーに警告する方法はありますか?

これを行う一般的な方法はありませんが、システム固有のランタイム チェックが可能な場合があります。

ただし、「生の」ポインターを避ける場合、スタック オブジェクトを使用してスマート ポインターを初期化しようとすると、すぐに突き出てしまいます。何も考えずに、これが間違っていることがわかります。

 MyAuto_ptr<int> p(&my_num);
于 2013-08-17T22:00:14.463 に答える