3

次のコードを検討してください。

int * p;

void Set()
{
    int i = 7;
    p = & i; // potentially disastrous
}

上書きされる可能性のある値を指すのが悪いことは知っていますが、 i などの値が宣言されてからこのように指されたときに失われるのを防ぐ方法があることを読んだことを思い出します。私は自分の教科書を精査しましたが、これについて詳述している正確なテキストを見つけるのに苦労しており、私はそれを想像していたのではないかと考え始めています. 関数内で宣言された一時的な値を安全に指す方法はありますか? 一時的な値を一時的ではなくする方法は?

事前にご協力いただきありがとうございます。

4

4 に答える 4

4

i などの値が宣言されてからこのように指されたときに失われるのを防ぐ方法があることを読んだことを思い出します

あなたが言及したことに最も近いのは(私があなたの文を正しく理解していれば) 、参照にバインドされたときに一時的な寿命を延ばすことを許可するルールです(C++ 11標準の§12.2/5):

struct X { int x = 0; };
X foo() { return X(); }
int main()
{
    X const& x = foo(); // The lifetime of the object bound to x is prolonged
    x.x = 42; // This is OK
}

ただし、ポインターや一時オブジェクト以外のオブジェクトには、そのようなルールはありません

一時的な値を一時的ではなくする方法は?

あなたの例でiは、一時的ではありません。これは、自動保存期間を持つオブジェクトです。一時オブジェクトとは、それを作成した完全な式の最後で (通常は) 存続期間が終了するオブジェクトです (上記の例外と、§ 12.2/4-5 にリストされているいくつかの例外を除きます)。

于 2013-04-10T21:42:21.807 に答える
2

const ref を一時的に取得すると、この const 参照のスコープの終わりまでこの一時的な寿命が延長されますが、この例では、一時的ではなくローカルの自動 object のアドレスを取得していますi

したがって、一時的な寿命を延ばすには、次のようにします。

const int& iref=int(3);
    int a= iref;
    //..do stuff with iref, i.e:
    printf("iref: %d\n", a);

出力:

iref: 3

RUN SUCCESSFUL (合計時間: 46ms)

于 2013-04-10T21:55:42.193 に答える
1

の値はi、メモリのどこかに存在する必要があります。関数内で宣言すると、スタックに割り当てられる可能性が高く、関数が戻るときに失われます。例のように値を常に定数にする必要がある場合は、関数の外で static const として宣言する必要があります。

int * p;
static const int i = 7;

void Set()
{
    p = & i;
}

これが必要でない場合は、あなたが何を達成しようとしているのかをよりよく理解できるように、非常に最小限のサンプル コードを少し詳しく説明してください。

于 2013-04-10T21:48:56.207 に答える
1

staticキーワードを使用できます。

#include <stdio.h>

int *p;

void set() {
    static int x = 7;
    p = &x;
}

int main(){
    set();
    printf("%d", *p);
}

正しく 7 を出力します。

ただし、このようなコードを static キーワードとポインターの調査以外で使用することは強くお勧めしません。

于 2013-04-10T21:49:19.827 に答える