Размещение нового для смежной памяти - PullRequest
1 голос
/ 26 марта 2012

Я столкнулся с некоторыми проблемами при использовании нового размещения для непрерывной памяти. Пожалуйста, сообщите мне, если есть какой-либо другой способ сделать это.
Пожалуйста, обратитесь мой код.

#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;
}

Ответы [ 3 ]

1 голос
/ 26 марта 2012

У вас есть начало памяти в pMyClass, и шаг - sizeof (MyClass).Итак, что вам нужно сделать, например:

MyClass* pMyClass2 = ::new((MyClass*)pMyClass + 1)MyClass();
0 голосов
/ 26 марта 2012

Попробуйте:

MyClass* pMyClass1 = :: new(pMyClass)MyClass[10];   
0 голосов
/ 26 марта 2012

Вы должны вызвать новое размещение внутри цикла, который повторяется в 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();
    }
    // ... 
}
...