2

これは許可されていますか?:

class A;
void foo()
{
    static A();
}

実行しようとするとシグナル11が表示されますが、以下は正常に機能します。

class A;
void foo()
{
    static A a;
}

ありがとうございました。

4

4 に答える 4

4

いいえ。C++には「匿名オブジェクト」のようなものはありません。すぐに破棄されるタイプAのオブジェクトを定義するようなものがあります。あなたが書いたのは、変数に割り当てられないAオブジェクトを返す式です。たとえば、printfの戻りコードは通常、割り当てられたり使用されたりすることはありません。

そのコードでは、それが機能した場合、ヒープの外部に割り当てられる「オブジェクトなし」を宣言することになります。割り当てるオブジェクトがないため、意味がありません。

于 2008-12-24T16:28:54.863 に答える
4

「匿名」自動変数は作成できますが、静的変数は作成できません。次の例では、クラス A のオブジェクトを作成し、コンストラクタを呼び出してから、関数の終了時にデストラクタを呼び出します。

class A;
void foo()
{
    A();
}

ヒープにオブジェクトを割り当てるか、事前に割り当てられた場所にオブジェクトを構築することで、同様の効果を得ることができます。

void foo()
{
    new A();
}

void foo()
{
    static char memory[sizeof (A)];
    new (memory) A();
}

ただし、どちらの場合も、後で delete を呼び出すためにポインタが保持されないため、オブジェクトを正しくクリーンアップできません。静的メモリが解放されても、デストラクタが呼び出されることはありません。匿名オブジェクトは、ガベージ コレクターで使用した場合にのみ実際に作成されます。

于 2008-12-24T16:40:09.880 に答える
3

どういうわけか、この男はシングルトンコンストラクターの副作用の後であると思います。

とにかく、すでにくそったれに変数名を付けてください。

于 2008-12-24T17:08:03.393 に答える