5

でヒープ変数を定義するとnew、名前を指定せずにポインターを取得することが知られています。

Var *p = new Var("name", 1);

しかし、プログラムの後半で pwith が指す変数をクリアする必要があります。delete p

関数の終了後に自動的にクリアされるようにスタック変数を宣言したいのですが、ポインタだけを取得したいのですが、次のようにします。

Var v("name", 1);
Var *p = &v;

非常に退屈で、指定子vが参照されることはありません。

スタック クラス インスタンスを宣言し、その名前を指定せずにそのポインターを取得できますか?

4

5 に答える 5

2

スタックに割り当てることによってこれを行う方法はありません。std::make_sharedただし、ヒープには次を使用できます。

#include <memory>

std::shared_ptr<Var> p = std::make_shared<Var>();
于 2013-06-05T01:46:28.000 に答える
0

オーバーヘッド(shared_ptrなど)なしでそれを克服する方法はないと思います。したがって、それを書く最短の方法は次のようになります。

Var v("name", 1), *p = &v;
于 2013-06-05T08:18:32.960 に答える
-2

はい、アドレスを一時 (つまりスタック) オブジェクトに戻し、それをポインターに割り当てることができます。ただし、コンパイラは、現在のスコープが終了する前に、実際にオブジェクトを破棄する (つまり、メモリ内のそのセクションを上書きする) 場合があります。(明確にするために: これは決してこれをしないことを意味します。)異なるオペレーティング システム上の異なるバージョンの GCC で観察される動作については、以下のコメントの説明を参照してください(バージョン 4.5.3 がエラーではなく警告のみを表示するという事実が、コンパイルした場合にポインターが現在のスコープ内のどこでも有効であるという意味で、これが常に「安全」であることを示しているかどうかはわかりませんその特定のバージョンの GCC を使用しますが、私はそれを期待しません。)

これが私が使用したコードです(Jonathan Lefflerの提案に従って変更されました):

#include <stdio.h>

class Class {
public:
    int a;
    int b;
    Class(int va, int vb){a = va; b = vb;}
};

int main(){ 
    Class *p = &Class(1, 2);
    Class *q = &Class(3, 4);
    printf("%p: %d,%d\n", (void *)p, p->a, p->b);
    printf("%p: %d,%d\n", (void *)q, q->a, q->b);
}

GCC 4.5.3 を使用してコンパイルし、(Windows 7 SP1 上で) 実行すると、このコードは次のように出力されます。

0x28ac28: 1,2
0x28ac30: 3,4

GCC 4.7.1 を使用してコンパイルし、(Mac OS X 10.8.3 上で) 実行すると、次のように出力されました。

0x7fff51cd04c0: 0,0
0x7fff51cd04d0: 1372390648,32767

いずれにせよ、変数を通常どおりに宣言して、「ポインターのような」ものが必要なすべての場所で使用しない理由がわかりません&v(たとえば、引数としてポインターを必要とする関数など)。

于 2013-06-05T04:41:24.947 に答える