Изменить размер массива с помощью нового - PullRequest
1 голос
/ 12 октября 2019

Поэтому я пытаюсь изменить размер массива, вызвав функцию ResizeArray (). Тем не менее, я не знаю, как правильно использовать «удалить» в этом случае. (Я создаю новый int * и копирую значение из оригинала в него, а затем я делаю исходный указатель, указывающий на новый, теперь я не знаю, что "удалить"

    class Base

        {
    private:
        int sizeInClass;
        int *arrayy=nullptr;

    public:
            Base(int s)
            {
             sizeInClass=s;
             arrayy = new int[s]{};
             setValue();
            };
        void setValue()
        {
             for(int x=0;x<sizeInClass;x++)
             {
             arrayy[x]=x;
             }
        }

        void print()
        {
             int countter=0;
             for(int x=0;x<sizeInClass;x++)
             {
             countter++;
             cout<<arrayy[x]<<endl;
             }
             cout<<"The size of the array is : "<<countter<<endl;
        }


        void ResizeArray(int newSize)
        {
            int *newArray = nullptr;

            newArray = new int[newSize];

                for(int x=0;x<sizeInClass;x++)
                {
                    newArray[x]=arrayy[x];
                }

            delete [] arrayy;    /////////////////////////////////// should i use deleate here ? 

            arrayy = newArray;

            delete [] newArray; /////////////////////////////////// or should I use deleate here ?

            sizeInClass = newSize;
        }



        ~Base()
        {
        delete [] arrayy;  /////////////////////////////////// or just use delete here
        arrayy=nullptr; 
        }

};


int main()
{

   Base b(5);
   b.print();
   b.ResizeArray(8);
   b.setValue();
   b.print();

    return 0;

}

Ответы [ 2 ]

0 голосов
/ 12 октября 2019

Что касается обработки ресурсов, вам обязательно нужно перераспределить ресурсы в деструкторе, чтобы освободить ресурсы, когда ваш контейнерный класс уничтожен. Если вы хотите изменить размер содержащегося массива, вы обрабатываете его в функции ResizeArray, поэтому ниже приведено базовое предложение с поясняющими комментариями:

    void ResizeArray(int newSize)
    {
        int *newArray = new int[newSize];

        if (nullptr != newArray) { // we take action only if allocation was successful

            for(int x=0;x<sizeInClass;x++)
            {
                newArray[x]=arrayy[x];
            }
            delete [] arrayy;    // good, here you delete/free resources allocate previously for an old array 
            arrayy = newArray;   // good, you redirect member ptr to newly allocated memory


        /* delete [] newArray; ups, we have member ptr point to this location 
        and we cannot delete it, after this, accessing it would be UB, 
        beside in dtor we would have double, second deletion */

            sizeInClass = newSize;
        }
    }

С вашим деструктором все в порядке.

Возможно,дальнейшие улучшения в вашем коде, но это связано с вашим вопросом.

0 голосов
/ 12 октября 2019

Первый и третий из предложенных вами delete верны.

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