[英]Exception thrown: write access violation. this was nullptr
所以我正在嘗試制作一個緩沖區類。 這個緩沖區類包含一個大小為 384*4 的巨大緩沖區。 該計划是針對每個接收到的 UDP 數據報,大小(384),調用緩沖區類並返回一個指向數據報應寫入位置的指針。
並且會有另一個偵聽器指針指向 RtAudio 播放將從中 memcpy。 [收聽部分還不完全相關,因為我仍然有寫入緩沖區的問題]
當我嘗試調用 server_->getPointer() (如下所示)時,會拋出“ Exception thrown: write access violation. this was nullptr.
”。 請幫我!! 並告訴我是否還有其他需要提供的。
緩沖區.h
#pragma once
#ifndef BUFFER_H
#define BUFFER_H
class Buffer {
private:
int bufferSize = 192 * 2; // one frame takes 2 Byte [int16]
int nBuffers = 4;
int *buffer_ = nullptr;
int* writerPointer = nullptr;
int* listenerPointer = nullptr;
int writerCounter = 0;
int listenerCounter = 0;
int* tempW = nullptr;
int* tempL = nullptr;
public:
Buffer();
~Buffer();
int* getWriterPointer();
int* getlistenerPointer();
int * getPointer();
};
#endif // !BUFFER_H
緩沖區.cpp
#include"Buffer.h"
#include <iostream>
Buffer::Buffer() {
buffer_ = reinterpret_cast<int*>(malloc(bufferSize*nBuffers));
memset(buffer_, (int)5, bufferSize*nBuffers);
std::cout << "new Buffer" << bufferSize * nBuffers << std::endl;
listenerPointer = buffer_;
writerPointer = buffer_;
std::cout << "HERE " << *buffer_ << std::endl;
std::cout << "new Buffer" << bufferSize * nBuffers << " pointer a " << listenerPointer << " pointer b " << writerPointer << std::endl;
}
Buffer::~Buffer() {
delete buffer_;
}
...
//For teting purposes
int* Buffer::getPointer(){
bufferSize = 192 * 2;
std::cout << "get pointer asdfasdf::" << writerCounter << std::endl;
std::cout << "pointer's position offset: " << writerCounter - 1 << std::endl;
if (writerCounter == nBuffers - 1) {
writerCounter = 0;
return writerPointer + (bufferSize*(nBuffers - 1));
}
else {
writerCounter += 1;
return writerPointer + (bufferSize*(writerCounter - 1));
}
}
主文件
#include <iostream>
#include "Buffer.h"
int main()
{
std::cout << "Hello World!\n";
Buffer *buffer_ = new Buffer();
buffer_->getPointer();
}
查找協議部分的“零復制”。
您遇到的問題是您的指針在您嘗試使用它時實際上是一個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
的數量與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
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.