为什么动态分配在Visual Studio中达到断点之前没有释放内存的情况下显示严重错误

时间:2018-10-17 11:50:54

标签: visual-c++

#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 :(得分:0)

您的程序有未定义的行为。您只为一个int

分配了内存
m_data = new int(length);

但是您正在编写多个元素,因此您正在修改没有访问权限的存储区-它是UB。 更改为

m_data = new int[length];