Ошибка сегментации и возвращение значения, хранящегося в элементе?

0

заголовок

#ifndef INTVECTOR_H
#define INTVECTOR_H

using namespace std;
class IntVector{
private:
    unsigned sz;
    unsigned cap;
    int *data;
public:
    IntVector();
    IntVector(unsigned size);
    IntVector(unsigned size, int value);
    unsigned size() const;
    unsigned capacity() const;
    bool empty() const;
    const int & at (unsigned index) const;
};

#endif

Главный

#include "IntVector.h"
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> iVector;
int *array;
IntVector::IntVector(){
    sz = 0;
    cap = 0;
    *data = NULL;
    vector<int> iVector (sz);
    iVector.reserve(sz);
}

IntVector::IntVector(unsigned size){
    sz = size;
    iVector.resize(sz);
    iVector.reserve(sz);
    cap = iVector.capacity();
    array = new int[sz];
    array = 0;
}

IntVector::IntVector(unsigned size, int value){
    sz = size;
    iVector.reserve(sz);
    cap = iVector.capacity();
    array = new int[sz];
    for(int i = 0; i < sz; i++){
        array[i] = value;
    }
}

unsigned IntVector::size() const{
    return sz;
}

unsigned IntVector::capacity() const{
    return cap;
}

bool IntVector::empty() const{
    if(sz > 0){
        return false;
    }
    else{
        return true;
    }
}

const int &IntVector::at(unsigned index) const{
    if(index > sz){
        exit(0);
    }
    else{
        return array[index];
    }
}

У меня есть эта надоедливая проблема в попытке установить int * data в NULL, так как я получаю ошибку сегментации. Какой метод следует использовать для назначения * данных Null в IntVector, чтобы избежать ошибки сегментации? Это не похоже на то, что я переназначаю что-либо для * Data, поэтому я немного смущен.

Вторая часть моего вопроса - это функция IntVector :: at. Предполагается вернуть значение, хранящееся в элементе, в переданной позиции индекса, но я не уверен, как я могу напрямую вернуть значение, так как это динамически распределенный массив, и то, что я читал в Google, было довольно запутанным. Нужно ли использовать специальный параметр для доступа к значению? Спасибо.

  • 1
    Может быть, немного не по теме, но exit(0); для неверного индекса? Как кто-то должен выяснить, что не так? Вы могли бы рассмотреть возможность создания исключения. А что происходит с array и iVector ? Они не являются частью вашего класса, и использование их так, как они, будет очень плохо для вас.
  • 0
    Для моего назначения я должен динамически выделить массив, например, для IntVector (размер без знака): «Устанавливает размер и емкость IntVector в значение передаваемого параметра, а также динамически выделяет массив этого размера».
Показать ещё 1 комментарий
Теги:

2 ответа

2
Лучший ответ
*data = NULL;

Вы не устанавливаете data в NULL (предпочитаете nullptr), вы устанавливаете значение в *data равным NULL. data здесь нетинициализированный указатель, поэтому разыменование его недействительно.

То, что вы хотели, было:

data = NULL;

Или лучше

data = nullptr;

Или, лучше всего, используйте список инициализаторов.

IntVector::IntVector() : sz(0), cap(0), data(nullptr)
{
    // I removed your vector initialization since 
    // you're just using sz, which has a value of 0.
    // iVector is already initialized here, but I don't
    // believe that you mean to shadow it as you are doing.
    // iVector is declared statically, and then again here.
}
0
*data = NULL;

устанавливает содержимое ячейки памяти в NULL. Но поскольку данные еще не указывают нигде, это неверно.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню