2012-03-26 5 views
0

連続したメモリに新しいプレースメントを使用する際にいくつかの問題に直面しています。これを行う方法が他にある場合は、私に案内してください。
私のコードを参照してください。連続したメモリのプレースメント

#include <new> 
//================================================ 
class MyClass 
{ 
private: 
    int ma; 
public: 
    MyClass():ma(-1){}  
}; 
//=========================================== 

int main() 
{ 
    // I am allocating the memory for holding 10 elements of MyClass on heap 
    void* pMyClass = ::operator new(sizeof(MyClass)*10); 

    //! Note :: the address of pMyClass1 and pMyClass will now point to same 
    //location after calling placement new 

    MyClass* pMyClass1 = :: new(pMyClass)MyClass(); 

    //! Problem with this is that, 
    //! i can only instantiate the constructor for the base address. That is 
    //! pMyClass[0]. 
    //! If i have to instantiate it for all the other instances, 
    //! that is pMyClass[1] to pMyClass[9], then how to do it ? 
    return 0; 
} 
+2

'のstd ::ベクトル' –

答えて

0

あなたはメモリの先頭を持っていますpMyClassで、ストライドはsizeof(MyClass)です。だから、何あなたがする必要があることは、たとえば次のとおりです。

MyClass* pMyClass2 = ::new((MyClass*)pMyClass + 1)MyClass(); 
+0

または '新しい(pMyClass + sizeof(MyClass))MyClass()'。またはちょうど不正行為をし、 ':: operator new'関数の戻り値をキャストして、' MyClass * pMyClass'を宣言してください。 –

0

あなたは、ループ内の新しい配置を呼び出す必要があり、そのメモリの10の連続したチャンクの繰り返し処理:

int main() 
{ 
    void* pMyClass = ::operator new(sizeof(MyClass)*10); 
    MyClass* pMyClass1 = reinterpret_cast<MyClass*>(pMyClass); 
    for (size_t i=0; i<10; ++i) { 
     ::new(pMyClass1++)MyClass(); 
    } 
    // ... 
} 
+0

は、あなたは私が供給しているコードについて詳しく説明できますか? – Atul

+2

@Atulループがわからない場合は、新しいプレースメントをまだ使用してはいけません。私は[良いC + +の本](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)をつかむことをお勧めします。 –

0

試してみてください。

MyClass* pMyClass1 = :: new(pMyClass)MyClass[10]; 
+1

新しい配列配置を使用しないでください。それは壊れています:http://stackoverflow.com/q/8720425 –

+0

また、正しい削除[]を提供するために、配列サイズを格納するコンパイラのためのいくつかの余分なメモリを確保する必要があります。割り当てはvoid * pMyClass = :: operator new(sizeof(MyClass)* 10 + extra)にする必要があります。実用的な目的のためには、extra = sizeof(uint64_t)で十分です。あなたは余分な値を計算する標準に準拠した方法を知らない。 – user396672

+0

@ user396672あなたは '余分な 'のために必要な値を知る方法がない。それはR、Martiho Fernandesが壊れていると言って意味するものです。 1024は "普通は十分です"でも、sizeof(uint64_t)よりも保証はありません。 –

関連する問題