2017-04-07 5 views
-4
#include <iostream> 
#include <cstdlib> 
using namespace std; 

class Box { 
    public: 
     Box() { 
     cout << "Constructor called!" <<endl; 
     } 
     void printer(int x) 
    { 
     cout<<x<<" printer"<<endl; 
    } 

     ~Box() { 
     cout << "Destructor called!" <<endl; 
     } 

}; 

int main() { 
    Box* myBoxArray = new Box[4]; 

    Box* myBoxArray2 = (Box*)malloc(sizeof(Box[4])); 
    myBoxArray2->printer(23); 
    *myBoxArray2; 
    *(myBoxArray2).printer(23); 

    return 0; 
} 

問題は、単にコンストラクタがプリントアウトされていないされていることが、私の単純なderefrence myBoxArray2へのポインタは、コンストラクタが印刷されていない場合とどちらも印刷目的球printerです。 はまた、なぜ私は-> funnctionプリンタの実行を使用するときには、私は同等*(myBoxArray2).printer(23)違いは

+2

ここで 'malloc()'の使用は無効です。クラスインスタンスは、スタック上に、または 'new'を介して割り当てる必要があります。あなたが 'malloc()を使うと、C++の機械はどれも呼び出されません。 – EJP

+0

'myBoxArray2'は、大きさのあるメモリ空間へのポインタです。無関係なもののサイズです。その空間に 'myBoxArray'をコピーしたとしても、コンストラクタを呼び出すことは決してありません。なぜなら、それを待つのは、構築されていないからです。 – moopet

答えて

1

mallocはメモリのみを割り当てます。は、オブジェクトを不確定状態にすることができるコンストラクタを呼び出さない。

あなたはほとんど 決して使用 malloccallocまたは freeべき++ Cで

。可能であれば、newnew[]も避けてください。オブジェクトインスタンスまたはインスタンスのベクトルを代わりに使用してください。 (最初に本当に無関係である)あなたの2番目の質問については


*(myBoxArray2).printer(23).選択オペレータ以来間違っである間接参照演算子*よりprecedence高いを持っています。これはまず、.メンバセレクタを無効なポインタに使用し、何も返されないので間違っているprinterを返すことを試みることを意味します。

あなたは正確にあるmyBoxArray2->printer(23)と同じ(*myBoxArray2).printer(23)を(アスタリスクの場所は括弧内であることに注意)、したいです。

また、myBoxArray2->printer(23)myBoxArray2[0].printer(23)と同じです。

1

を使用していないときの違いはそのmalloc関数であるすべてでそれを初期化せずにメモリを割り当てることがあります。一方、newは適切なコンストラクタを呼び出してそのメモリを初期化し(そのコンストラクタがそのメモリを初期化するように作られている場合)、クラスを使用可能にするために他の処理を行います。

deleteもデストラクタを呼び出します。

ルールは、あなたが何をしているのか分からない限り、mallocをC++で使用しないでください。

+0

本当にあなたが何をやっているのか(なぜあなたがそれをやっているのか)知っていなければ、新しいコンストラクタです。 – UKMonkey

+0

あなたが何をしているのか知っていても、おそらく*それはしないでください。コンパイラは、 "Undefined Behavior"の高速チケットである最適化と違反のために、それらのオブジェクトがどのように初期化されるかを前提にしているかもしれません。 – tadman