#include <iostream>
using namespace std;
class test
{
public:
int a,b[100];
test() {
cout << "Constructor called" << " \n " ;
a=10;
}
};
int main()
{
test a1;
test *b2;
test *pointer = new test;
cout << a1.a << endl;
cout << pointer->a << " \n ";
cout << b2->a << " \n ";
return 0;
}
Я хотел бы знать, если только два объекта созданы вышеупомянутым кодом, для объекта ‘a1’ и указателя объекта ‘pointer’. Я предполагаю, что указатель ‘b2’ не получает выделенную для него память. В этом случае последний «кут» << b2-> a «, если это создаст ошибку сегментации. Я получаю доступ к расположению, память которого я не выделил. Но я не получаю ошибку сегментации. Компилятор justs печатает случайное значение.
Мой вопрос: «Здесь три объекта выделены памятью или только два»?
Почему нет ошибки сегментации?
a1
выделяется в автоматической памяти.
b2
это не объект (ну, не объект определенного вами типа), а указатель, и он не указывает на правильное местоположение. Это висячий указатель, разыменование приводит к неопределенное поведение. Все может случиться.
pointer
указатель на объект в динамической памяти Это не сам объект, но он указывает на объект, созданный new test
,
Здесь три объекта выделены памятью или только два
Только два.
Почему нет ошибки сегментации?
Потому что неопределенное поведение означает, что все может случиться. Любое поведение соответствует стандартам.
Других решений пока нет …