2016-10-30 5 views
-2

C++では、このようなコンストラクタを呼び出さずにオブジェクトを作成します。これは定義された動作としてカウントされますか?コンストラクタコールを使用しないC++オブジェクトの作成

class Foo { 
public: 
    int *ptr; 
    int a, b; 

    Foo() { ptr = new int{}; } 
    ~Foo() { delete ptr; } 
    void set(int a_, int b_) {a = a_; b = b_;} 
    void print() { std::cout << *ptr << a << b; } 
}; 

int main() { 
    char *array[sizeof(Foo)]; // note the pointer 
    *((int**)array) = new int{3}; 
    ((Foo*)array)->set(1, 2); 
    ((Foo*)array)->print(); // 312 
} 
+8

いいえ、これは完全に定義されていない動作です。 –

+2

オブジェクトを作成していないので、既存のメモリ位置をオブジェクトにキャストしているだけです。 – Robert

+0

標準のC++構文に何が問題なのですか? –

答えて

2

あなたがオブジェクトのデータを保持できるメモリ・ブロックを構築しているが、それはオブジェクトではありません(未解放ヒープメモリを無視してください)。

オブジェクトは、そのメモリスライスよりも潜在的に多くのもので構成されています。それはになることはできませんが、それは他の多くのことになる可能性があります。

+0

補足として:これを行うなら、クラスレイアウトを表示するためのコンパイラのオプションを探して、コードはプラットフォームに依存する可能性が非常に高いでしょう。 MSVCは '/ d1reportSingleClassLayoutX'を使います。ここで' X'はクラスの名前(またはその名前の一部)です。 Clangは '-Xclang -fdump-record-layouts'を使用しています。私の知る限りでは、レイアウトを生成する(または単に出力する)前に少なくともクラスをインスタンス化する必要があります。 –

関連する問題