Исключение: нарушение прав доступа.это был nullptr - PullRequest
0 голосов
/ 22 декабря 2018

Итак, я пытаюсь создать буферный класс.Этот класс буфера содержит огромный буфер размером 384 * 4.План был для каждой полученной дейтаграммы UDP, размер (384), вызывается класс буфера и возвращается указатель, куда должна быть записана дейтаграмма.

И будет еще один указатель слушателя, для которого воспроизведение RtAudio будет memcpyот. [Слушающая часть еще не совсем актуальна, так как у меня все еще есть проблема записи в буфер]

Когда я пытаюсь вызвать сервер _-> getPointer () (показано ниже), "Exception thrown: write access violation. this was nullptr." выбрасывается.Пожалуйста, помогите мне!!и скажите мне, есть ли что-нибудь еще, что я должен предоставить.

Buffer.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

Buffer.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));
    }
}

main.cpp

#include <iostream>
#include "Buffer.h"


int main()
{
    std::cout << "Hello World!\n"; 
    Buffer *buffer_ = new Buffer();

    buffer_->getPointer();


}

1 Ответ

0 голосов
/ 22 декабря 2018

Найдите «нулевое копирование» для части протокола.

Проблема, с которой вы столкнулись, заключается в том, что ваш указатель на самом деле равен 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
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...