0

我想要做的是将一个类对象放在缓冲区中,然后以后能够正确引用它。本质上它是一个使用缓冲区进行数据存储的容器类。我想到的最好的方法是存储对象的地址在缓冲区中,通过其索引引用它,然后进行转换。我现在看到这样做可能会导致内存泄漏,因为该对象仅在此方法中本地存在,并且正在返回该本地对象的地址。有没有办法可以将对象存储到缓冲区中,然后通过调用重载的 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 = 是自定义类对象时,我会遇到问题。

4

1 回答 1

1

你的Add函数中有未定义的行为,首先你存储一个指向局部变量的指针(with oBuffer = (char*) nElement),然后用相同的语句覆盖你已经在上面的语句中覆盖的原始指针,然后你返回的地址指针(即char **),但将其转换为单个指针。

您的索引功能也将不起作用, “数组”nIndex中的索引也是char如此,除非模板类型Tchar.

如果要存储某种类型的对象,请使用std::vector.

如果您想要序列化以保存到文件/通过网络发送,它也不适用于包含指针、集合、文件等的任何类型。

于 2013-09-04T06:34:08.513 回答