@Noortvel

Как выделяется память в классах?

Вот допустим у нас есть класс
class Examp{
    public:
    int size;
    string str2;
    string *str3;
    vector<int> arr1;
    vector<int> *arr2;
    Examp(){
    arr2 = new vector<int>();
    str3 = new string();
    }
    ~Examp(){
      delete arr2;
      delete str3;
      }
}

};
int main(){
   Examp ex = new Examp ();
    delete ex;
    Examp ex2();
}

Где выделяется память для переменных в случае динамического и в случае статического объявления?
  • Вопрос задан
  • 987 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Ответ на это есть в стандарте языка.
Для начала, у нас есть спецификация размещения.
Во вторых, у нас есть спецификация полей класса.
10-й пункт спецификации полей класса говорит о том, что для полей класса недопустимы спецификаторы extern и thread_local, а значит допустимы только static и mutable.
Спецификатор mutable не влияет на фактическое размещение поля класса.

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

В остальном, размещение всех нестатических полей класса производится внутри памяти создаваемого объекта.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Mercury13
Программист на «си с крестами» и не только
Examp ex = new Examp ();
Неверный код, надо Examp* ex = new Examp;

В случае статического определения (Examp ex2;) — в той памяти, где обычно располагаются объекты. То есть:
• Если это поле объекта — то в теле объекта, которое может быть где угодно (куча, сегмент данных, стек).
• Если static/глобальный — то в сегменте данных.
• Если локальный — в стеке. Конкретно тут локальная переменная, и она будет в стеке.

В случае динамического определения (Examp* ex = new Examp;) — в «куче».
В этом примере, кроме операции new, которая заводит объект в куче, видим ещё и указатель, который располагается «там, где обычно» — в теле объекта, сегменте данных или стеке.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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