SomeObj<unsigned int>* Buffer;
char* BufferPtr = MemoryManager::giveMeSomeBytes(resX*resY*sizeof(SomeObj<unsigned int>));
Buffer = new(BufferPtr) SomeObj<unsigned int>[resX*resY];
當我踏上過去,這些線路與調試,它表明我的價值觀變量緩衝區和BufferPtr:放置新+陣列+排列
BufferPtr: 0x0d7f004c
Buffer: 0x0d7f0050
我真的不明白,爲什麼那些值不同。按照我的理解,放置new應該使用從地址'BufferPtr'開始的內存,以便在分配的內存上使用默認構造函數初始化數組元素,並返回指向數組中第一個元素的第一個字節的指針,這應該是與傳遞給placement new操作符完全相同的字節。
我理解錯了什麼,或者有人能告訴我爲什麼值不同?
謝謝!
//編輯:好的 - 我研究這個問題,並進一步得到了更多的混亂的結果:
int size = sizeof(matth_ptr<int>);
char* testPtr1 = (char*)malloc(a_resX*a_resY*sizeof(int));
int* test1 = new(testPtr1) int[a_resX*a_resY];
char* testPtr2 = mmgr::requestMemory(a_resX*a_resY*sizeof(int));
int* test2 = new(testPtr2) int[a_resX*a_resY];
char* testPtr3 = (char*)malloc(a_resX*a_resY*sizeof(matth_ptr<int>));
matth_ptr<int>* test3 = new(testPtr3)matth_ptr<int>[a_resX*a_resY];
char* testPtr4 = mmgr::requestMemory(a_resX*a_resY*sizeof(matth_ptr<int>));
matth_ptr<int>* test4 = new(testPtr4)matth_ptr<int>[a_resX*a_resY];
調試器返回我下面的值我的變量:
size: 4
testPtr1:0x05100418
test1: 0x05100418
testPtr2:0x0da80050
test2: 0x0da80050
testPtr3:0x05101458
test3: 0x0510145c
testPtr4:0x0da81050
test4: 0x0da81054
所以它必須清楚與我的通用智能指針類matth_ptr有關,所以它在這裏:
template <class X> class matth_ptr
{
public:
typedef X element_type;
matth_ptr(){
memoryOfst = 0xFFFFFFFF;
}
matth_ptr(X* p)
{
unsigned char idx = mmgr::getCurrentChunkIdx();
memoryOfst = (int)p-(int)mmgr::getBaseAddress(idx);
assert(memoryOfst<=0x00FFFFFF || p==0);//NULL pointer is not yet handled
chunkIdx = idx;
}
~matth_ptr() {}
X& operator*() {return *((X*)(mmgr::getBaseAddress(chunkIdx)+(memoryOfst&0x00FFFFFF)));}
X* operator->() {return ((X*)(mmgr::getBaseAddress(chunkIdx)+(memoryOfst&0x00FFFFFF)));}
X* get() {return ((X*)(mmgr::getBaseAddress(chunkIdx)+(memoryOfst&0x00FFFFFF)));}
template<typename T>
matth_ptr(const matth_ptr<T>& other) {memoryOfst=other.memoryOfst;}//put these two operators into the private part in order to prevent copying of the smartpointers
template<typename T>
matth_ptr& operator=(const matth_ptr<T>& other) {memoryOfst = other.memoryOfst; return *this;}
template<typename T>
friend class matth_ptr;
private:
union //4GB adressable in chunks of 16 MB
{
struct{
unsigned char padding[3]; //3 bytes padding
unsigned char chunkIdx; //8 bit chunk index
};
unsigned int memoryOfst; //24bit address ofst
};
};
任何人都可以解釋我發生了什麼事?謝謝!
關閉我的頭頂,可能是對齊或虛擬空間。 – 2010-10-25 02:47:45
是否意味着如果新建立的對象不像傳遞的地址對齊,那麼它只是在較高的內存地址處創建一個對象? – Mat 2010-10-25 02:50:08
我會懷疑如此,雖然不確定。測試的一種方法是查看這是否發生在選定的內存位置(即強制giveMeSomeBytes給出對齊的地址)。 – 2010-10-25 02:51:50