2012-03-26 13 views
0

Ich habe einige Probleme bei der Verwendung von Placement neu für zusammenhängende Speicher. Bitte führen Sie mich, wenn es andere Möglichkeiten gibt, dies zu tun.
Bitte beziehen Sie sich auf meinen Code.Platzierung neu für zusammenhängenden Speicher

#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 :: vector ' –

Antwort

0

Sie haben den Anfang des Speichers in pMyClass, und der Schritt ist sizeof (MyClass). Also, was Sie tun müssen, ist zum Beispiel:

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

Oder 'neu (pMyClass + sizeof (MyClass)) MyClass()'. Oder schummle einfach und deklariere 'MyClass * pMyClass', indem du die Funktion' :: operator new' zurückbringst. –

0

Sie haben die Platzierung rufen neue in einer Schleife, dass iteriert über die 10 zusammenhängende Abschnitte des Speichers:

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

können Sie auf dem Code erarbeiten, die ich geliefert haben? – Atul

+2

@Atul Wenn Sie keine Loops kennen, sollten Sie das Placement noch nicht verwenden. Ich empfehle Ihnen, [ein gutes C++ Buch] zu nehmen (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –

0

Versuchen:

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

Verwenden Sie die Array-Platzierung nicht neu. Es ist kaputt: http://stackoverflow.com/q/8720425 –

+0

Sie sollten auch etwas zusätzlichen Speicher für Compiler reservieren, die Array-Größe speichert (um korrektes Löschen []) bereitzustellen; Daher sollte die Zuweisung ungültig sein. * pMyClass = :: operator new (sizeof (MyClass) * 10 + extra). Für praktische Zwecke ist extra = sizeof (uint64_t) normalerweise ausreichend; Wie auch immer, ich kenne keine standardkonforme Methode, um den zusätzlichen Wert zu berechnen – user396672

+0

@ user396672 Es gibt keine Möglichkeit, den Wert zu kennen, den Sie für extra benötigen. Das ist es, was R, Martiho Fernandes meint, indem er sagt, dass es kaputt ist. 1024 ist "normalerweise ausreichend", aber es ist nicht mehr garantiert als "sizeof (uint64_t)". –

Verwandte Themen