При создании динамического массива Critical error detected c0000374 С++

349
11 декабря 2018, 05:40

Возникла проблема при инициализации динамического массива

Проблема возникает в строках:

int n;
int* arr = new int[n];

Изза того что n не равна конкретному числу. Как исправить? Вроде нарушений доступа и синтаксиса нет. И почему данная проблема возникла?

Вот весь код:

class Base 
{
    virtual void Norma() = 0;
};
    class Vector: public Base
    {
        private:
            int n;
            int* arr = new int[n];
        public:
            Vector(){}
           ~Vector(){}
           void InputVector() 
           {
               cout << "Input n:";
               cin >> n;
               for (int i = 0; i < n; i++) 
               {
                   //arr[i] = rand() % 10;
                   cin >> arr[i];
               }
           }
           void Norma()
           {
               int max=arr[0];
               for (int i = 0; i < n; i++) 
               {
                   if (arr[i] > max) 
                   {
                       max = arr[i];
                   }
               }
               cout <<"Vector Norma is: "<<fabs(max);
           }
           void OutVector()
           {
               for (int  i = 0; i < n; i++)
               {
                   cout << arr[i] << " ";
               }
           }
    };
    int main()
{

    Vector vec;
    vec.InputVector();
    vec.Norma();
    vec.OutVector();
    system("pause");
    return 0;
}
Answer 1

Достаточно часто мне на SO попадается код вроде этого:

int n;
int* arr = new int[n];

Почему-то новичкам кажется, что new int[n] магическим образом связывает n с размером массива, так что потом, меняя n, можно растягивать и сжимать массив. Это не так. После вызова new int[n] размер массива остается фиксированным.

Так что нужно сначала получить n, а только потом делать new.

Решение: int* arr = new int[n]; заменить на просто int *arr;, а после cin >> n; поставить arr = new int[n];.

Кроме того, обратите внимание: Из вашего класса как из решета течет память! В деструкторе не хватает delete [], а также недостает копирующего конструктора и оператора присваивания.

Советую почитать: правило трех (the rule of three).

Answer 2

А чему равно Ваше n при создании объекта, не пробовали вывести? Уверен там какой-то мусор. Логичнее задавать это число в конструкторе или инициализировать его после создания экземпляра класса. Вы же выделяете память под неопределённое число элементов, и только потом это число задаёте.

READ ALSO
Помогите с фибоначи и лямбдой

Помогите с фибоначи и лямбдой

Нужно заполнить дек числами фибоначи при помощи алгоритма generate и лямбда функцииМожет кто подкинет идейку через анонимную лямбду?А то через...

305
foreach в функции

foreach в функции

Подскажите пожалуйста почему такая запись выдаёт ошибку"не найдена соответствующая функция begin, необходимая для этого основанного на диапазоне...

712
Передача массива в функцию не обьявляя его

Передача массива в функцию не обьявляя его

Как можно передать массив в функцию не обьявляя его?

180
Управление динамической памятью в С++

Управление динамической памятью в С++

Подскажите есть ли правила хорошего тона или общепринятые соглашения по управлению динамической памятью в C++

215