代码之家  ›  专栏  ›  技术社区  ›  Felipe

将通用值复制到无符号字符数组中,并在C++中复制回

c++
  •  -1
  • Felipe  · 技术社区  · 7 年前

    我有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 回复  |  直到 7 年前
        1
  •  2
  •   Mike Vine    7 年前

    addValue 您可以显式删除 _valueChar 缓冲器。那么 下一条线 写入已删除的缓冲区。你希望这个代码做什么?

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

    std::vector 只要它足够大,你就不会有这些问题。