С++ обернул необработанный указатель в класс в очереди контейнера. Не работает?

Пример Исходный код, показывающий проблему:

#include<iostream>
#include<deque>
#include<memory>


using namespace std;


class Element
{
public:
    Element()
    {
        fptr = new float[10];
        ele1 = 0;
    }
    ~Element()
    {
        if (fptr != NULL)
            delete[] fptr;

    }
    void print()
    {
        cout<<"ele1: "<< ele1 <<endl;
        for(int i = 0; i != 10; i++)
        {
            cout<<"ele "<<i<<": "<<fptr[i]<<endl;

        }
    }
    float ele1;
    float* fptr;
private:

};

void InsertElement(deque<Element>& dq)
{
    Element el;
    float* z = new float[10];
    for(int i = 0; i != 10; i++)
        z[i] = i;

    for(int i = 0; i != 10; i++)
        el.fptr[i] = z[i];
    el.ele1 = 10;

    dq.push_back(el);


}



int main(int argc, char* argv[])
{
    deque<Element> dq;

    cout<<dq.size()<<endl; // check size of the dequeue.
    InsertElement(dq); // insert a Element with a buffer of float[10]
    dq.front().print();

    return 0;
}

Результат выполнения приведенного выше кода:

0
ele1: 10
ele 0: -1.5884e+038
ele 1: -1.5884e+038
ele 2: -1.5884e+038
ele 3: -1.5884e+038
ele 4: -1.5884e+038
ele 5: -1.5884e+038
ele 6: -1.5884e+038
ele 7: -1.5884e+038
ele 8: -1.5884e+038
ele 9: -1.5884e+038

Почему значения не соответствуют ожидаемым, они были изменены внутри функции InsertElement, а dq передается по ссылке. Я не могу понять, что не так с приведенным выше кодом? Очевидно, что ele1, который не является частью массива, получил свое значение, которое было присвоено внутри функции InsertElement, но не множество. массив кажется неинициализированным, хотя мы присвоили ему значения от 0 до 9. Почему такое странное поведение? Пожалуйста, помогите объяснить мне это, я действительно сбит с толку.

Еще одна проблема с кодом: он выдает исключение в конце программы при вызове деструктора класса Element из-за удаления[]. Я исправил раньше, но код как есть вызывает исключение прямо сейчас. Не уверен, почему.


person Amir Gasmi    schedule 05.03.2021    source источник
comment
Хорошо, спасибо за правило трех вещей. Итак, я должен определить, как скопировать указатель? потому что я не предоставил конструктор копирования. это решило проблему! отличный.   -  person Amir Gasmi    schedule 06.03.2021