簡體   English   中英

拋出異常:寫訪問沖突。 這是 nullptr

[英]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相乘以獲得正確的大小。

忘記mallocfree並使用newdelete代替它們。

這是刪除分配有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.

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