![](/img/trans.png)
[英]C++ - Copying unsigned char* to a new unsigned char* array
[英]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.