簡體   English   中英

將通用值復制到無符號char數組,然后用C ++復制回來

[英]Copying generic values to unsigned char array and copying back in 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;
}

addValue您明確刪除_valueChar緩沖區。 然后,沿着的下一行寫入已刪除的緩沖區。 您期望這段代碼做什么?

這是代碼中有關內存管理的許多問題中的第一個。

只需使用std::vector ,只要它足夠大,您就不會遇到任何這些問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM