1

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

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
4

5 に答える 5

7

いいえ、一般的なケースではなく、持ち運び可能な方法でもありません。ヒープがメモリ内のどこにあるかがわかっている場合は、知識に基づいて推測することはできますが、信頼できる方法ではありません。

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

于 2009-03-25T21:32:53.387 に答える
4

ANSI Cの場合、参照などはありません。そのため、質問を言い換えて、割り当てられたヒープへのポインターまたは割り当てられたスタックオブジェクトへのポインターについて説明することをお勧めします。

多くの場合、ヒープのアドレスは「小さい」で大きくなり、スタックは「大きい」で小さくなりますが、これはヒューリスティックで移植性がないだけです。

于 2009-03-25T21:34:15.643 に答える
1

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

&を使用して何かのアドレスを取得する必要がある場合は、それを解放することはできませんdeleteそれ以外の場合、ポインターを渡す場合は、どの関数がポインターをdelete解放するかを文書化する必要があります。C ++でこれを行う最も簡単な方法は、shared_ptrまたはのようなスマートポインタクラスを使用することscoped_ptrです。

于 2009-03-26T06:28:58.247 に答える
1

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

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

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

于 2009-03-26T07:43:45.680 に答える
0

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

于 2009-03-26T00:27:06.307 に答える