C/C++

Вызвано необработанное исключение: нарушение доступа для чтения. this было nullptr. С++

Попытка обратиться к динамическим данным по адресу в памяти через указатель, после освобождения ресурсов динамически выделенной памяти или после вызова деструктора объекта. Например,

#include <iostream>
using namespace std;
class Any {
public:
Any(int value) : pointer(new int) {
*pointer = value;
}
~Any() {
if (pointer != nullptr) {
delete pointer;
pointer = nullptr;
}
}
int data()const {
return *pointer; // Похожий случай после второго вызова метода data() в main()
}
private:
int* pointer;
};
int main() {
Any any(5);
auto before = any.data();
cout << before << '\n';
any.~Any(); // Явный вызов деструктора
auto after = any.data();
cout << after << '\n';
system("pause > nul");
}
Александр Николаев
Александр Николаев
81 162
Лучший ответ
Видишь ли, объект состоит из двух указателей: на данные и на код.
И вот указатель на код существует всегда и зависит от класса объекта.
А указатель на данные создается тогда, когда выреляется место в куче под эти самые данные.
Поэтому метод объекта можно вызвать, даже если объект не создан.
А вот когда несозданный объект попытается использовать свои данные - начнется вот такая веселая фигня.
появляется ровно из-за того, что тебе пишет IDE: this в вызове метода указывает на ноль, т. е. объекта по факту нету, но ты пытаешься вызвать его метод

пример:
auto ptr = static_cast< CVisibleCheck >(nullptr);
ptr->UpdateVisibleStruct();

открывай отладчик, смотри стек, откуда вызывался метод и почему там оказался nullptr
Покажи весь код где происходит вызов метода. (лучше на pastebin, github и т. д)
Роман Сычёв
Роман Сычёв
17 671