Почему я получаю сообщение об ошибке «free (): неверный указатель прерван (ядро выгружено)»? C ++ - PullRequest
0 голосов
/ 10 апреля 2020

Я пытаюсь перегрузить оператор =, чтобы скопировать и в конечном итоге поменять местами два запроса?

Однако я получаю ошибку free(): invalid pointer Aborted (core dumped)

, когда время l oop выходы. Все работает нормально, когда закомментирован вызов функции tempDeque.display();.

Вот блок кода для перегрузки операторов:

class Resizeable_deque{
    private:
        T* array;
        int front;
        int back;
        int deque_size;
        int capacity;
        int initial_capacity;

    public:
        // Resizeable_deque();

        //accessors
        Resizeable_deque(int n=10) //done constructor
        {
            if (n==10)
            {
                array = new T[10];
                capacity = 10;
                initial_capacity = 10;
                front = -1;
                back = 0;
                deque_size = 0;
                // cout <<  "Capacity = " << capacity << endl;
                // cout << "OK!";

            }

            else if  (n<=10)
            {
                array = new T [n];
                capacity = n;
                initial_capacity = n;
                front = -1;
                back = 0;
                deque_size = 0;
                // cout <<  "Capacity = " << capacity << endl;

                // cout << "OK!!";
            }
        }

        ~Resizeable_deque(); //done destructor

        //accessors
        T* getArray() const;
        T getFront() const; // done get front element
        T getBack() const; //done get last element
        int size() const; //done get the size of the queue
        int getCapacity() const; //done get the current capacity of queue
        int getInitialCapacity() const;

        //data member setters
        // void setArray(T* newArray);
        // void setfront(int newFront);
        // void setBack (int newBack);
        // void setSize (int newSize);
        // void setCapacity (int newCapacity);
        // void setInitialCapacity(int newInitialCapacity);


        //state check functions
        bool full()  const;
        bool empty() const; //done check if empty
        T display() const;

        //mutators
        void push_front (const T e);
        void push_back (const T e);
        void pop_front();
        void pop_back();
        void pop_front_back();
        void resizeDeque(float resizefactor, int newsize);
        void swap(Resizeable_deque tempDeque);
        Resizeable_deque operator=(Resizeable_deque b)
        {
            cout <<"B:";
            b.display();
            cout << "Back: " << b.getBack() << endl;
            int bSize = b.size();
            Resizeable_deque<string> tempDeque(b.getCapacity());
            while (!b.empty())
            {
                tempDeque.push_back(b.getFront());
                // b.display();
                b.pop_front();
                cout<< "popped!" << endl;
                tempDeque.display();
                cout <<  "back is: " << b.getFront() << endl;
                cout << endl;
                cout << endl;
                cout << endl;
            }

            //end of loop call swap
        };
        void clear();

};

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

При передаче по значению (например, в функцию swap) будет вызван ваш конструктор копирования. Поскольку вы не определили конструктор копирования, для вас будет создан конструктор по умолчанию. Этот конструктор копирования просто скопирует значение указателя array, что означает, что у вас будет 2 экземпляра, указывающих на одну и ту же динамически распределенную память. Когда оба этих деструктора запустятся, он дважды освободит память, что приведет к неопределенному поведению, которое будет отображаться как ошибка, которую вы видите.

Вы в основном нарушаете правило 0/3/5

Простым решением было бы сделать массив std::unique_ptr<T[]>, который будет вызывать ошибки сборки, пока вы не исправите свою проблему.

0 голосов
/ 10 апреля 2020

Я не могу добавить комментарий, поэтому пишу здесь.

Я заметил, что вы используете operater new[] для выделения памяти, вы использовали free() для указателя, который вы выделили с помощью new[]? Это может вызвать ошибку.

Если нет, проверьте, используете ли вы free() для неоригинального указателя (у вас ++ или - на нем и измените его смещение?).

В противном случае проверьте, не совершали ли вы какие-либо вне доступа.

Пусть это поможет вам.

...