2009-03-25 9 views
1

実行時にポインタと参照を区別するにはどうすればよいですか?例えば、ポインタであるかどうかを知らずにデータ型のポインタを解放したいのであれば、どうすればよいでしょうか?変数がスタックまたはmalloc()によって割り当てられているかどうかを確認する方法はありますか?実行時にポインタと参照を区別するANSI C++

void destInt(int* var) 
{ 
    free(var); 
} 


int num = 3; 
int &numRef = num; 
int* numPtr = (int*)malloc(sizeof(int)); 
*numPtr = num; 

destInt(&numRef); //Syntactically correct but generates invalid pointer() 
destInt(numPtr); //Fine syntactically and logically 
+0

これはCではありません。または、Cのように見えません。 – strager

+0

Cには参照がありません... –

+0

また、あなたの "destInt(numRef);"構文的にはまったく正しいものではありません。参照をint *を受け付ける関数に渡すことはできません。 –

答えて

7

いいえ、一般的なケースではなく、携帯ではありません。メモリ内のどこにヒープがあるか分かっていれば、推測することはできますが、信頼できる方法ではありません。

EDIT:Cには参照がないことにも注意してください。 Cの&オペレータは、変数のアドレスを取得するために使用されます。

4

もしANSI Cなら、参照のようなものはないので、割り当てられたオブジェクトをスタックするためのポインタやヒープへのポインタについての質問を言い換えるとよいでしょう。

多くの場合、ヒープのアドレスは「小さく」成長し、スタックは「大きく」成長しますが、それはヒューリスティックでポータブルではありません。

0

mallocを使用する場合、メモリはSTACKではなくヒープに割り当てられます。

1

C++では、参照かポインタかを区別する情報は、コンパイル時の型情報の一部であるです。 Cでは、これはセマンティクスでは無関係な区別です。

&を使用して住所を取得する必要がある場合は、deleteに変更するか、無料にすることはできません。それ以外の場合は、ポインタを回している場合は、deleteの権限を持つ関数を記述するか、解放する必要があります。 C++でこれを行う最も簡単な方法は、shared_ptrまたはscoped_ptrのようなスマートポインタクラスを使用することです。

1

あなたが達成しようとしていることは....このようにしないでください。

通常、スタックの境界を取得できますが、これは通常、かなりコンパイラ/プラットフォーム固有のプロセスになります。ヒープと同じです。あなたが新しいバージョンにフックして独自のバージョンで削除した場合は、おそらくヒープの開始と終了の場所を知っているでしょう。さもなければあなたはしません。

しかし、あなたが吠えている木は良いものではありません。あなたが本当にこのようにする必要があると確信しているなら、ポインタを使って情報を渡してください。 needFreeなどと呼ばれるブールを持つ構造体にラップします。しかしそうでなければ、あなたがこの問題にぶつかっているという事実は、あなたが解決しようとしている問題がよりきれいな方法で解決できることを示していることがよくあります。

関連する問題