我想要做的是将一个类对象放在缓冲区中,然后以后能够正确引用它。本质上它是一个使用缓冲区进行数据存储的容器类。我想到的最好的方法是存储对象的地址在缓冲区中,通过其索引引用它,然后进行转换。我现在看到这样做可能会导致内存泄漏,因为该对象仅在此方法中本地存在,并且正在返回该本地对象的地址。有没有办法可以将对象存储到缓冲区中,然后通过调用重载的 operator[] Foo[index] 来正确引用它?我曾尝试在 C++ 中使用相同的技术: Casting an Object to char* for save/loading但是在我的情况下,静态/重新解释转换往往会在我尝试对缓冲区中的内容进行地址查找时更改地址值。
附言。我知道使用向量将是存储类对象的一种更简单的方法,但部分限制是我不能使用 STL 进行数据存储并且必须依赖给我的缓冲区。
#include <stdlib.h>
#include <assert.h>
#ifndef FOO_H_
#define FOO_H_
template <typename T>
class Foo {
char * oBuffer = NULL;
unsigned items = 0, bSize = 0;
public:
Foo(char * pBuffer, unsigned nBufferSize) :
oBuffer(pBuffer),
items(),
bSize(nBufferSize){
/*for (unsigned i =0; i < nBufferSize; i++)
oBuffer[i] = &pBuffer[i];*/
}
~Foo(){ delete[] oBuffer;}
T * Add(){ ///====== Adds an element to the container, constructs it and returns it to the caller.
assert(Capacity() > Count());
T nObj; // new object
T *nElement = &nObj; // address of new object
oBuffer += items; // incrementing pointer by item count
oBuffer = (char*) nElement; // attempt to store object address in buffer[items] location
items++; // increment items count by one
return (T*) &oBuffer;
}
T * operator [] (unsigned nIndex){ ///====== Returns the n th element of the container [0..Count -1].
return (T*) (&oBuffer[nIndex]);
}
};
#endif
最初我试图按如下方式添加:
T * Add(){ ///====== Adds an element to the container, constructs it and returns it to the caller.
assert(Capacity() > Count());
T *add =&(oBuffer[items++] = T{});
return add;
}
但是当 T = 是自定义类对象时,我会遇到问题。