0

私がやろうとしているのは、クラス オブジェクトをバッファに配置し、後でそれを正しく参照できるようにすることです。本質的には、データ ストレージにバッファを使用するコンテナ クラスです。私が考えた最善の方法は、オブジェクトのアドレスを格納することでした。バッファ内で、インデックスで参照してからキャストします。オブジェクトがこのメソッドでローカルにのみ存在し、そのローカル オブジェクトのアドレスが返されるため、そのようにすることでメモリ リークが発生する可能性があることがわかりました。オブジェクトをバッファに格納し、オーバーロードされた 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 = がカスタム クラス オブジェクトである場合、問題が発生します。

4

1 に答える 1

1

関数には未定義の動作があります。Add最初にローカル変数へのポインターを格納し ( を使用oBuffer = (char*) nElement)、次に同じステートメントで元のポインターを上書きします。これは上記のステートメントで既に上書きされています。ポインター (つまりchar **) ですが、単一のポインターとしてキャストします。

nIndex「配列」のインデックスと同様に、インデックス関数も機能せずchar、テンプレート化された型Tchar.

特定のタイプのオブジェクトを保存する場合は、 を使用しますstd::vector

ファイルへの保存/ネットワーク経由での送信にシリアル化が必要な場合は、ポインター、コレクション、ファイルなどを含む型に対しても機能しません。

于 2013-09-04T06:34:08.513 に答える