64,654
社区成员
发帖
与我相关
我的任务
分享
struct NODE {
int data ;
int next ;
} ;
class myAllocator ;
class myBuffer {
private:
friend myAllocator ;
NODE *mBuffer ;
int mLength ;
public:
inline explicit myBuffer (int len) {
_DEBUG_ASSERT_ (len >= 0) ;
mBuffer = len > 0 ? new NODE[len] : NULL ;
mLength = len ;
}
inline ~myBuffer () {
if (mBuffer != NULL) {
delete[] mBuffer ;
mBuffer = NULL ;
mLength = 0 ;
}
}
inline myBuffer (myBuffer &&right) {
mBuffer = right.mBuffer ;
mLength = right.mLength ;
right.mBuffer = NULL ;
right.mLength = 0 ;
}
inline myBuffer &operator= (myBuffer &&right) {
if (this == &right)
return *this ;
this->~myBuffer () ;
new (this) myBuffer (std::move (right)) ;
return *this ;
}
inline NODE &operator[] (int index) {
_DEBUG_ASSERT_ ((index >= 0 && index < mLength) || mLength == 0) ;
return mBuffer[index] ;
}
inline const NODE &operator[] (int index) const {
_DEBUG_ASSERT_ ((index >= 0 && index < mLength) || mLength == 0) ;
return mBuffer[index] ;
}
} ;
class myAllocator {
private:
myBuffer mAlloc ;
int mFree ;
public:
inline explicit myAllocator (int len) :mAlloc (len) {
update (0 ,-1) ;
}
inline int &operator[] (int index) {
_DEBUG_ASSERT_ (mAlloc[index].next == -2) ;
return mAlloc[index].data ;
}
inline int alloc (int arg) {
resize () ;
int ret = mFree ;
mAlloc[ret].data = arg ;
mFree = mAlloc[ret].next ;
mAlloc[ret].next = -2 ;
return ret ;
}
private:
inline void resize () {
if (mFree != -1)
return ;
myAllocator ret (mAlloc.mLength + 1024) ;
for (int i = 0 ; i < mAlloc.mLength ; i++)
ret.mAlloc[i] = mAlloc[i] ;
ret.update (mAlloc.mLength ,mFree) ;
mAlloc = std::move (ret.mAlloc) ;
mFree = ret.mFree ;
}
inline void update (int ib ,int jb) {
mFree = jb ;
if (ib >= mAlloc.mLength)
return ;
for (int i = ib ; i < mAlloc.mLength - 1 ; i++)
mAlloc[i].next = i + 1 ;
mAlloc[mAlloc.mLength - 1].next = mFree ;
mFree = ib ;
}
} ;
int main () {
myAllocator al2 (0) ;
int a2 = -1 ;
int b2 = -1 ;
while (TRUE) {
b2 = (b2 != -1 ? al2[b2] : a2) = al2.alloc (-1) ;
}
return 0 ;
}
b2 = (b2 != -1 ? al2[b2] : a2) = al2.alloc (-1) ;
000000013F568939 cmp dword ptr [b2],0FFFFFFFFh
000000013F56893D je main+84h (013F568954h)
000000013F56893F mov edx,dword ptr [b2]
000000013F568942 lea rcx,[al2]
000000013F568946 call myAllocator::operator[] (013F56100Fh)
000000013F56894B mov qword ptr [rbp+188h],rax
000000013F568952 jmp main+8Fh (013F56895Fh)
000000013F568954 lea rax,[a2]
000000013F568958 mov qword ptr [rbp+188h],rax
000000013F56895F mov rax,qword ptr [rbp+188h]
000000013F568966 mov qword ptr [rbp+138h],rax
000000013F56896D mov edx,0FFFFFFFFh
000000013F568972 lea rcx,[al2]
000000013F568976 call myAllocator::alloc (013F56130Ch)
000000013F56897B mov rcx,qword ptr [rbp+138h]
中断-》 000000013F568982 mov dword ptr [rcx],eax
000000013F568984 mov rax,qword ptr [rbp+138h]
000000013F56898B mov eax,dword ptr [rax]
000000013F56898D mov dword ptr [b2],eax
监视里看到的变量值都是正确的
然而就中断了,不是很清楚汇编能分析一下什么问题吗
rax 71680 unsigned __int64
rbx 0 unsigned __int64
rcx 5882024 unsigned __int64
rdx 71680 unsigned __int64
rbp 2620336 unsigned __int64