В C++ делают Вас, всегда имеют, инициализируют указатель на объект с new
ключевое слово?
Или можете Вы просто иметь это также:
MyClass *myclass;
myclass->DoSomething();
Я думал, что это было указателем, выделенным на стеке вместо "кучи", но так как объекты обычно являются выделенной "кучей", я думаю, что моя теория является, вероятно, дефектной??
Совет.
Нет, у вас могут быть указатели на выделенные стеком объекты:
MyClass *myclass;
MyClass c;
myclass = & c;
myclass->DoSomething();
Это, конечно, обычное дело при использовании указателей в качестве параметров функции:
void f( MyClass * p ) {
p->DoSomething();
}
int main() {
MyClass c;
f( & c );
}
Так или иначе, указатель всегда должен быть инициализирован. Ваш код:
MyClass *myclass;
myclass->DoSomething();
приводит к этому ужасному состоянию, неопределенному поведению .
Нет, вы не можете этого сделать, MyClass *myclass
определит указатель (память для указателя выделяется на стеке), который указывает на случайную область памяти. Попытка использовать этот указатель приведет к неопределенному поведению.
В C++ вы можете создавать объекты как на стеке, так и на куче, например, так:
MyClass myClass;
myClass.DoSomething();
Выше мы выделим myClass на стеке (этот термин отсутствует в стандарте, но я использую его для ясности). Память, выделенная для объекта, автоматически освобождается, когда переменная myClass
выходит из области видимости.
Другой способ выделения памяти - выполнить new
. В этом случае вы должны позаботиться об освобождении памяти, выполнив delete
самостоятельно.
MyClass* p = new MyClass();
p->DoSomething();
delete p;
Помните о части delete
, иначе произойдет утечка памяти.
Я всегда предпочитаю использовать объекты, выделенные из стека, когда это возможно, поскольку мне не нужно беспокоиться об управлении памятью.
Если вам нужен объект на стеке, попробуйте следующее:
MyClass myclass;
myclass.DoSomething();
Если вам нужен указатель на этот объект:
MyClass* myclassptr = &myclass;
myclassptr->DoSomething();