我在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;
}
答案 0 :(得分:2)
在addValue
中,您明确删除了_valueChar
缓冲区。然后沿着下一行写入已删除的缓冲区。您希望这段代码做什么?
这是代码中有关内存管理的许多问题中的第一个。
只需使用std::vector
,只要它足够大,您就不会遇到任何这些问题。