私がやろうとしているのは、クラス オブジェクトをバッファに配置し、後でそれを正しく参照できるようにすることです。本質的には、データ ストレージにバッファを使用するコンテナ クラスです。私が考えた最善の方法は、オブジェクトのアドレスを格納することでした。バッファ内で、インデックスで参照してからキャストします。オブジェクトがこのメソッドでローカルにのみ存在し、そのローカル オブジェクトのアドレスが返されるため、そのようにすることでメモリ リークが発生する可能性があることがわかりました。オブジェクトをバッファに格納し、オーバーロードされた operator[] Foo[index] を呼び出して後で正しく参照する方法はありますか? C++で同じ手法を使用してみました: 保存/読み込みのためにオブジェクトを char* にキャストするしかし、私の場合、静的/再解釈キャストは、バッファ内の内容をアドレス検索しようとすると、アドレス値を変更する傾向があります。
ps。ベクトルを使用すると、クラス オブジェクトを格納する簡単な方法になることはわかっていますが、制限の一部として、データ ストレージに 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 = がカスタム クラス オブジェクトである場合、問題が発生します。