C ++ Прерванное ядро ​​сбрасывается в конце его выполнения - PullRequest
0 голосов
/ 02 марта 2019

Я довольно новичок в C ++ и в настоящее время выполняю школьное задание по векторам.Заголовочный файл содержит реализацию функций, необходимых для удовлетворения требований.Я почти закончил с программой, но, к сожалению, в конце ее выполнения она выдала сообщение «aborted core dumped».Я не могу понять, почему это так.Все отлично работало до конца.Именно во время теста присваивает это сообщение.Мне понадобится ваша экспертиза по этому вопросу.Спасибо!

Мой вывод:

********** TestAssign **********
push_back 10 floats:
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
0 1 2 3 4 5 6 7 8 9 (size=10 capacity=16)
Assign: b = a, print a,b
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
Assign: a = a, print a
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
Aborted (core dumped)

Вывод школы (правильный):

********** TestAssign **********
push_back 10 floats:
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
0 1 2 3 4 5 6 7 8 9 (size=10 capacity=16)
Assign: b = a, print a,b
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)
Assign: a = a, print a
0 2 4 6 8 10 12 14 16 18 (size=10 capacity=16)

Заголовочный файл (Моя реализация):

template <typename T>
vec 
{

private:
T* v;
int count;
int capacity;
public:

vector(){ //default constructor
    capacity=0;
    v = nullptr;
    count = 0;
}

vector(const vector& b) //copy contructor
{
count = b.count;
capacity = b.capacity;
v = new T[capacity];
for (int i = 0; i < capacity; i++)
{
    this->v[i] = b.v[i];
}
}   

 vector(vector&& tmp): v(tmp.v),//move constructor
                      count(tmp.count),
                      capacity(tmp.capacity)
{
    tmp.v = nullptr;
}

~vector() {//destructor

if (v != NULL);
    {
        delete [] v;
        v = NULL;
    }
}

void push_back(const T& t)
{
    if(count+1>capacity)
{
    capacity = std::max(2*capacity, 1);

    T* newData = new T[capacity];
    for(int i=0; i <count; i++)
    {
        newData[i] = v[i];
    }
    delete[] v;
    v = newData;
}
v[count++] = t;
}

T pop_back() {
    //..
}

size_t size() const
    {
        //..
    }

bool empty() 
{ 
  //..
}   

 T operator[](unsigned index) const //subscript operator
 {
     //...
 }

 T& operator[](unsigned index) //subscript operator 
 { 
    //...
 }

void clear(){
    //...
}

void erase(T position)
{
  //...
}

void insert(int index, T number)
{
    //...
}

vector& operator = (const vector &rhs) //copy assignment
{
    ../
}

vector& operator=(vector&& rhs) { //move assignment

    if (this != &rhs) {
        delete[] v;
        this->v = rhs.v;
        rhs.v = nullptr;
    }
    return *this;
}

template <typename T1>
friend void Print(const vector<T1>& s); //friend print

friend  void Print(const vector<unsigned char>& s);     //friend print if 
//unsigned

};
template <typename T1>
void Print(const vector<T1>& s)
{
    // std::cout << std::fixed << std::setprecision(2);
    for(int i = 0; i < s.count; i++) 
    {
    std::cout<<s.v[i]<<" ";
    }
    std::cout<< "(size=" << s.count << " " << "capacity=" << s.capacity << 
")";
    std::cout<<std::endl; 
    }

void Print(const vector<unsigned char>& s)
{
    //...
}

Основной файл:

void TestAssign(void)
{
std::cout << "\n********** TestAssign **********\n";
cs150::vector<float> a, b;

std::cout << "push_back 10 floats:\n";
for (float i = 0; i < 10; i++) {
    a.push_back(2 * i);
    b.push_back(i);
}

Print(a);
Print(b);

std::cout << "Assign: b = a, print a,b\n";
b = a;
Print(a);
Print(b);

std::cout << "Assign: a = a, print a\n";
a = a;
Print(a);
}

1 Ответ

0 голосов
/ 02 марта 2019

Проблема в вашем операторе присваивания:

vector& operator = (const vector &rhs) //copy assignment
{
    v = rhs.v;
    return *this;
}

, который копирует указатель v вместо того, чтобы копировать базовый массив (вы также забудете скопировать другие элементы, count иcapacity)

В результате после b = a; вы в конечном итоге дважды освобождаете один и тот же массив в a и b, что приводит к segfault.

ИзменениеОператор присваивания будет больше похож на конструктор копирования:

vector& operator = (const vector &b) //copy assignment
{
    if (this != &b) {
        count = b.count;
        capacity = b.capacity;
        v = new T[capacity];
        for (int i = 0; i < count; i++)
        {
            this->v[i] = b.v[i];
        }
    }
    return *this;
}

Не связанное примечание: у вас есть дополнительный ; в деструкторе:

    if (v != NULL);
                  ^ here

Я бы также оставил Moveсемантика пока отсутствует, если только вам не требуется поддерживать ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...