4

ポインター (foo(void *bar)) である関数パラメーターでは、const を使用して、ポインター (パラメーター) 自体が定数 (foo(void * const bar)) であること、および/またはそのデータが定数であることを指定できます。ポインターが指す定数 (foo(void const *bar)) です。

ただし、foo(void const *bar) の場合、これは呼び出し元に対して、foo が bar が指すデータを変更しようとしないことを保証するだけです。bar が指すメモリー位置が常に有効であることを、bar が foo に保証するわけではありません。

実行可能イメージ内の定数データを操作している場合、その保証を foo に提供でき、foo が関数呼び出しの期間よりも長くそのデータへの参照を保持する必要がある場合、foo は単にコピーを保持できます。データのコピーを作成する必要はありません。

この保証を C++ 型システムでエンコードする方法はありますか?

ありがとう。

4

4 に答える 4

3

生のポインターではありませんが、代わりにshared_ptrまたはunique_ptrを使用して、関数がポインターの所有権を持っていることを通知できます。

于 2012-09-03T19:29:24.520 に答える
3

Q: ポインターが常に有効なデータを指すように C++ で指定する方法はありますか?

A: いいえ。いつでも自分の足を撃つことができるようになっています :)

于 2012-09-03T19:24:09.033 に答える
1

入力としてポインタを受け入れる場合、それを保証する実際の方法はありません。ただし、有効なポインターのテーブルを維持し、入力をそのテーブルへのインデックスにすることができます。インデックスがテーブル内にあることを確認することで、それを検証できます。

それを除けば、あなたができる最善のことは、悪いポインタが使用されたときに発生する例外/シグナルをキャッチし、それから回復しようとすることです。

于 2012-09-03T19:28:41.547 に答える
1

私が採用したアプローチは、バッキングデータを指定するセマンティクスを導入するクラス表現を作成することですstatic。次に、簡単に構築できないこと、またはデータが再割り当てされないことを確認します。

いいえ、直接的な言語機能はありませんが、そのセマンティクスを導入するのは簡単です。

これは、クライアントが誤って標準データを不滅のデータコンテナにプロモートするのを防ぐ方法の図です。

template <typename T>
class t_immortal_data_container {
public:
  // how clients create t_immortal_data_container<T>,
  // avoiding implicit promotions:
  static t_immortal_data_container Create(T& pImmortalData) {
    return t_immortal_data_container(pImmortalData);
  }

  ~t_immortal_data_container() {
  }
public:
  ...
private:
  // private: ensure t_immortal_data_container<T> only can use
  // this constructor:
  t_immortal_data_container(T& pData) : d_immortalData(pData) {
  }
private:
  T d_immortalData; /* << as pointer or reference */
private:
  // prohibited -- no definition
  t_immortal_data_container() /* = delete */ ;
};

次に、このタイプをパラメーターとして受け入れるようにプログラムを更新し、それに応じてケースを処理します。

于 2012-09-03T19:28:49.767 に答える