Сначала я должен сказать, что ваш код,
MyClass *myclass;
myclass->DoSomething();
вызовет неопределенное поведение .
Поскольку указатель «myclass» не указывает ни на какие объекты типа «MyClass».
Здесь у меня есть три предложения для вас: -
вариант 1: - Вы можете просто объявить и использовать объект стека MyClass в стеке, как показано ниже.
MyClass myclass; //allocates memory for the object "myclass", on the stack.
myclass.DoSomething();
вариант 2: - Используя новый оператор.
MyClass *myclass = new MyClass();
Здесь произойдут три вещи.
i) Выделяет память для объекта типа «MyClass» в куче.
ii) Выделяет память для указателя типа «MyClass» «myclass» в стеке.
iii) указатель «myclass» указывает на адрес памяти объекта типа «MyClass» в куче
Теперь вы можете использовать указатель для доступа к функциям-членам объекта после разыменования указателя с помощью "->"
myclass->DoSomething();
Но вы должны освободить память, выделенную объекту типа «MyClass» в куче, прежде чем вернуться из области, если вы не хотите, чтобы она существовала. В противном случае это приведет к утечке памяти !
delete myclass; // free the memory pointed by the pointer "myclass"
вариант 3: - Вы также можете сделать, как показано ниже.
MyClass myclass; // allocates memory for the "MyClass" type object on the stack.
MyClass *myclassPtr; // allocates memory for the "MyClass" type pointer on the stack.
myclassPtr = &myclass; // "myclassPtr" pointer points to the momory address of myclass object.
Теперь указатель и объект находятся в стеке.
Теперь вы не можете вернуть этот указатель за пределы текущей области видимости, так как выделенная память указателя и объекта будут освобождены при выходе из области действия.
Таким образом, в качестве резюме, варианты 1 и 3 будут размещать объект в стеке, в то время как только опция 2 будет делать это в куче.