Найдите «нулевое копирование» для части протокола.
Проблема, с которой вы столкнулись, заключается в том, что ваш указатель на самом деле равен nullptr
в то время, когда вы пытаетесь его использовать.Вам нужно проверить возврат от malloc
:
Buffer::Buffer() :
buffer_(reinterpret_cast<int*>(malloc(bufferSize*nBuffers)))
{
if(buffer_ == nullptr) throw std::bad_alloc();
}
Но вместо этого вы должны использовать new
, который будет выполнять эту проверку и автоматически выбрасывать bad_alloc
, если он не пройдёт:
Buffer::Buffer() :
buffer_(new int[bufferSize*nBuffers])
{
// no need to check here
}
Для каждого malloc
вам нужен один free
, а для каждого new
вам нужен один delete
- и вы никогда не должны смешивать их.
Кроме того, malloc
выделяет байты, ноint
обычно составляет 4 или 8 байтов, поэтому вам нужно умножить количество int
s, для которых вы хотите выделить место, на sizeof(int)*CHAR_BIT/8
, чтобы получить правильный размер.
Просто забудьте о malloc
и free
и используйте вместо них new
и delete
.
Так вы удаляете свой массив, выделенный с помощью new int[...]
:
Buffer::~Buffer() {
delete[] buffer_; // delete array
}
Еще лучший вариант - использовать std_unique_ptr
, который будет делать delete[]
, когда он выходит из области видимости:
class Buffer {
private:
std::unique_ptr<int[]> buffer_;
public:
Buffer() :
buffer_(std::make_unique<int[]>(bufferSize * nBuffers))
{}
// ~Buffer() no need to implement a destructor unless you manually handle resources
};