2012-04-18 4 views
0

nullを指すポインタがあり、値を割り当てたい。しかし、私がそれを尊重すれば、私は誤りを得る。私はこれを試した:NULLを指すポインタに値を割り当てる方法

*nullPointer=value; 

しかし、私が言ったように、私はエラーが発生します。これどうやってするの?。後の値が(それはオブジェクトの)削除されると発生する、NullPointerがメモリを無効に指すことになりますので、私は

nullPointer=&value 

を行うことはできません。

+0

あなたは*ポインタを意味* NULLのですか? –

+1

ポインタがnullを指すことはできません。それは何かを指していないことを意味するnullポインターである可能性があります。宣言されたオブジェクトは、名前が表示されている限り削除することはできません。その範囲の終わりには存在しなくなるだけです。 '&value'は' nullPointer = &value; 'という代入が実行されたときの有効なアドレスです。後で無効になる可能性があります。 –

+1

[this](http://www.perlmonks.org/?node_id=542341)を読んで、あなたが達成しようとしていることを教えてください。そして[comp.lang.c FAQ](http://c-faq.com/)のセクション4と5を読んでください。 Cのポインタは基本的にC++のポインタと同じです。 –

答えて

2

ポインタは、メモリ(RAM)内の場所を指します。 null pointerがある場合、nullを指しています。つまり、メモリ内の位置を指していないことを意味します。ポインターがヌルである限り、ポインターをバックアップするメモリーがないため、ポインターが情報を保管するために使用することはできません。

ヌルポインタを使用するには、最初にメモリを割り当ててから、ポインタがその新たに割り当てられたメモリを指すようにする必要があります。

*int p = null;  
*p = 10; //this won't work as there is no memory backing up this pointer 
p = new int; 
*p = 10; 
+1

* "ヌルを指すポインタに値を割り当てることはできません。" * - 最適な表現ではありません。ポインタがnullを指すことはできません。あなたが言うように、何かを指していないことを意味するヌル(NULLポインタ、 'NULL')である可能性があります。そして、あなたは確かにnullポインタに値を割り当てることができます。それが指すオブジェクトに値を割り当てることはできません。 –

7

ポインタは意味のあるものを得るために有効なオブジェクトを指し示さなければならず、それが指し示すオブジェクトが有効であることを確認することはあなたの責任です。

オブジェクトがポイントしているオブジェクトがスタック上にあり、スコープが終了すると無効になる場合は、ダイナミックメモリを使用してオブジェクトをヒープに割り当てる必要があります。しかし、あなたが何をしているのか、これが必要なのかを知るには、情報が少なすぎます。

int *ptr = new int; 
*ptr = value; 
... 
... 
delete ptr; 
2

それはあなたがそれを再びおおよそNULLポインタのような役割を果たし、その時点でそのオブジェクトが削除されていない限り、/まで、オブジェクトを参照するポインタ、したいように聞こえる - つまり、あなたは、少なくともそれはdoesnのことを検出することができますもう何も指さない。

この場合、おそらくweak_ptr(C++ 11、TR1、Boostで利用可能)が必要です。あなたはそれをshared_ptrと一緒に使用します。オブジェクトへの最後のshared_ptrが破棄されると、オブジェクト自体も破棄されます。その後、weak_ptrが何も参照していないことを検出できます(詳細はBoost documentationなど)。

編集:ここではweak_ptr用ブースト・ドキュメントからの例です:

shared_ptr<int> p(new int(5)); 
weak_ptr<int> q(p); 

// some time later 

// this will succeed *only* if at least one other reference to the pointee still exists. 
if(shared_ptr<int> r = q.lock()) 
{ 
    // use *r 
} 
+0

削除されたオブジェクトへのポインタが無効であることをどのように検出しますか?ポインタを使用してオブジェクトを削除しても、ポインタはその値を保持します。いくつかのコンパイラ/プラットフォームでは、削除されたオブジェクトにポインタでアクセスすることができますが、これは明らかに未定義の動作です。 – bjhend

+0

@bjhend:これは未処理のポインタではなく、 'shared_ptr'と' weak_ptr'です。 'shared_ptr'はpointeeオブジェクトへの参照カウントを維持し、参照カウントがゼロになったときにのみそれを削除します。 'weak_ptr'を直接参照解除することはできません。まず' shared_ptr'に変換する必要がありますが、pointeeがすでに削除されていると失敗します。 –

+0

OK、あなたの最初の段落を通常のポインタに関する記述として誤解しました。私は今あなたがスマートポインタによって満たされている元の質問のポインタ要件を表明しただけを参照してください。 – bjhend

関連する問題