Создание класса в стеке, где переменная определена в заголовке - PullRequest
1 голос
/ 23 января 2012

В настоящее время я пытаюсь приступить к написанию правильного кода на C ++ (его запуск был приемлем для некоторых небольших прототипов, но он был уродливым).

Недавно я осознал разницу между экземплярами кучи и стека (O m= new O () против O m ()).

Теперь у меня есть класс, в котором заголовочный файл определяет переменную, которая содержит определение таблицы.

ChunkLoader.hpp:

TablePartion * tablePartial _;

ChunkLoader.cpp:

ChunkLoader () {tablePartial_ = new TablePartial (true, 0, 1);}

Теперь я хочу создать экземпляр tablePartial в стеке, но не могу использовать: TablePartial tablePartial_(true, 0, 1);

Я полностью слепой?Как я могу выделить tablePartial_ в стеке?Или я получаю это совершенно неправильно, и я не могу использовать в конструкторе, так как он будет вне области видимости после конструктора и, следовательно, будет освобожден?Но так как я прочитал, что переменные стека улучшают производительность, я бы хотел использовать инстанцирование стека (и становится красным delete).

Основная причина: переполнение стека подсказало мне избавиться от указателей, когдакогда-либо возможно.:)

Ответы [ 3 ]

7 голосов
/ 23 января 2012

Для начала вам, вероятно, следует избегать терминов "в стеке" или "в куче", это детали реализации, которые не имеют ничего общего с обсуждаемыми концепциями.Вместо этого мы обсуждаем время жизни объекта в терминах automatic (что более или менее коррелирует со стеком), dynamic (что более или менее коррелирует с кучей), static (что более или менее коррелируетс глобальными) и thread (который является глобальным для конкретного потока).

В ответ на ваш конкретный вопрос вы можете использовать инициализаторы конструктора для инициализации вашей переменной:

ChunkLoader() 
   : tablePartial_(true, 0, 1) 
{ 
}
1 голос
/ 23 января 2012

Поскольку объявление класса:

class MyClass
{
   SomeOtherClass x;
};

x полностью содержится в MyClass (это не указатель на SomeOtherClass).

Ergo, при созданииобъект MyClass в стеке, x также будет в стеке, и при создании объекта MyClass в куче, x также будет в куче.

РЕДАКТИРОВАТЬ:

Как я понял, вы хотите разместить x в стеке.Для этого любой экземпляр MyClass также должен находиться в стеке.Для этого вы можете сделать оператор new private:

class MyClass
{
   SomeOtherClass x;
private:
   void* operator new(size_t);
};
0 голосов
/ 23 января 2012

Если вы не использовали слово «new» в C ++ (избегая вызовов malloc и других вызовов C / OS для этого разговора), то у вас нет динамически выделенной памяти в «куче».

Все, что вы создаете в main () и вызываемые в нем функции, помещается в стек, если new не используется.Когда вы вводите новый вызов функции, вы получаете новый кадр стека, и все переменные, объявленные так:

void foo() {
    int x;
    std::string y;
}

создаются в стеке.

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

//These should be "classes" with private/public hiding but I'm being lazy.
struct MyClass {
    int x;
    virtual void foo();
};

//These should be "classes" with private/public hiding but I'm being lazy.
struct MyClassDerived : MyClass {
    void foo() { std::cerr << "foo called!" << std::endl; }
};

int main() {
    MyClassDerived x;
    MyClass* = &x;
    x->foo();
}
...