почему динамическое выделение показывает критическую ошибку, в то время как память не освобождается до достижения точки останова в Visual Studio - PullRequest
0 голосов
/ 17 октября 2018
#include<cassert>
#include<initializer_list>
#include<iostream>

class IntArray {

int m_length;
int *m_data;

public:
IntArray() : m_length(0), m_data(nullptr) {}
IntArray(int length) : m_length(length) {
    m_data = new int(length);
}
IntArray(const std::initializer_list<int> &list) : IntArray(list.size()) {
    int count = 0;
    for (auto &element : list) {
        std::cout << element << '\n';
        m_data[count] = element;
        ++count;
    }
}
~IntArray() { delete[] m_data; }

int& operator[](int index) {
    assert(index >= 0 && index < m_length);
    return m_data[index];
}

int getLength() { return m_length; }
};

int main() {
    IntArray array{ 4,3,2,1 };
    for (int i = 0; i < array.getLength(); i++)
        std::cout << array[i] << " ";


    system("pause");
    return 0;
}

Точка останова достигнута в системе линий («пауза»);Критическая ошибка обнаружена в Visual Studio, в то время как приведенный выше код прекрасно работает в режиме онлайн c ++ repl.Я просто не понимаю, почему вышеупомянутая ошибка появляется в visual studio.

1 Ответ

0 голосов
/ 17 октября 2018

Ваша программа имеет неопределенное поведение.Вы выделили память только для одного int

m_data = new int(length);

, но вы записываете более одного элемента, поэтому вы модифицируете область памяти, к которой у вас нет доступа - это UB.Изменить на

m_data = new int[length];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...