Указатель C++ на объекты

В C++ делают Вас, всегда имеют, инициализируют указатель на объект с new ключевое слово?

Или можете Вы просто иметь это также:

MyClass *myclass;

myclass->DoSomething();

Я думал, что это было указателем, выделенным на стеке вместо "кучи", но так как объекты обычно являются выделенной "кучей", я думаю, что моя теория является, вероятно, дефектной??

Совет.

23
задан Tony The Lion 7 June 2010 в 09:19
поделиться

3 ответа

Нет, у вас могут быть указатели на выделенные стеком объекты:

MyClass *myclass;
MyClass c;
myclass = & c;
myclass->DoSomething();

Это, конечно, обычное дело при использовании указателей в качестве параметров функции:

void f( MyClass * p ) {
    p->DoSomething();
}

int main() {
    MyClass c;
    f( & c );
}

Так или иначе, указатель всегда должен быть инициализирован. Ваш код:

MyClass *myclass;
myclass->DoSomething();

приводит к этому ужасному состоянию, неопределенному поведению .

37
ответ дан 29 November 2019 в 00:51
поделиться

Нет, вы не можете этого сделать, MyClass *myclass определит указатель (память для указателя выделяется на стеке), который указывает на случайную область памяти. Попытка использовать этот указатель приведет к неопределенному поведению.

В C++ вы можете создавать объекты как на стеке, так и на куче, например, так:

MyClass myClass;
myClass.DoSomething();

Выше мы выделим myClass на стеке (этот термин отсутствует в стандарте, но я использую его для ясности). Память, выделенная для объекта, автоматически освобождается, когда переменная myClass выходит из области видимости.

Другой способ выделения памяти - выполнить new . В этом случае вы должны позаботиться об освобождении памяти, выполнив delete самостоятельно.

MyClass* p = new MyClass();
p->DoSomething();
delete p;

Помните о части delete, иначе произойдет утечка памяти.

Я всегда предпочитаю использовать объекты, выделенные из стека, когда это возможно, поскольку мне не нужно беспокоиться об управлении памятью.

23
ответ дан 29 November 2019 в 00:51
поделиться

Если вам нужен объект на стеке, попробуйте следующее:

MyClass myclass;
myclass.DoSomething();

Если вам нужен указатель на этот объект:

MyClass* myclassptr = &myclass;
myclassptr->DoSomething();
10
ответ дан 29 November 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: