将通用值复制到无符号char数组,然后用C ++复制回来

时间:2018-11-07 16:24:16

标签: c++

我在C ++中有一个类,它表示一个缓冲区,可以在其中存储unsigned char。我有两种方法,一种是使用模板添加通用值,另一种是检索值。当我尝试检索值时,我得到了Segmentation fault (core dumped)。我正在使用memcpy如果更改为使用std::copy(value, value, _valueChar);,则会收到其他错误:error: no type named ‘value_type’ in ‘struct std::iterator_traits<int>’

#include <iostream>
#include <cstring>
#include <utility>
#include <vector>
#include <string>

class SkinnyBuffer {
private:
    unsigned char *_valueChar;
    std::size_t _sizeChar;
public:
    SkinnyBuffer();
    SkinnyBuffer(std::size_t size);
    ~SkinnyBuffer();
    void clean();

    template<typename T>
    void addValue(T value) {
        if (_valueChar != nullptr) {
            delete[] _valueChar;
        }
        // _sizeChar = n; // assume _size is a field
        // _valueChar = new unsigned char[_sizeChar];
        // std::copy(value, value, _valueChar);
        memcpy(_valueChar, &value, sizeof(value));
    }

    template<typename T>
    void addValue(std::size_t offset, T value) {
        if (_valueChar != nullptr) {
            delete[] _valueChar;
        }
        // _sizeChar = n; // assume _size is a field
        // _valueChar = new unsigned char[_sizeChar];
        // std::copy(value, value + offset, _valueChar);
        memcpy(_valueChar + offset, &value, sizeof(value));
    }

    unsigned char *getValue() {
        return _valueChar;
    }
};
#include "SkinnyBuffer.h"

SkinnyBuffer::SkinnyBuffer() {
}

SkinnyBuffer::SkinnyBuffer(std::size_t size) {
    _sizeChar = size;
    _valueChar = new unsigned char[_sizeChar];
}

SkinnyBuffer::~SkinnyBuffer() {
}

void SkinnyBuffer::clean() {
    _valueChar = new unsigned char[_sizeChar];
}

int main(int argc, char *argv[]) {

    int value = 50;
    int offset = sizeof(value);
    SkinnyBuffer b(offset);
    b.addValue(value);

    int dValue;
    memcpy(&dValue, b.getValue(), offset);
    std::cout << dValue << std::endl;
}

1 个答案:

答案 0 :(得分:2)

addValue中,您明确删除了_valueChar缓冲区。然后沿着下一行写入已删除的缓冲区。您希望这段代码做什么?

这是代码中有关内存管理的许多问题中的第一个。

只需使用std::vector,只要它足够大,您就不会遇到任何这些问题。