Быстрое распределение памяти / объем вопроса - PullRequest
0 голосов
/ 14 января 2011

Например, этот класс:

class RTPIPv4Address{
     public:
           RTPIPv4Address(int a, int b);
}

Глупый вопрос, но ... Я просто наткнулся на код, который инициализирует экземпляр класса, например, с

RTPIPv4Address adr(2,2);

Теперь яинтересно, это просто еще один синтаксис для обычного

RTPIPv4Address* adr = new RTPIPv4Address (2,2);

или у него есть какие-то другие эффекты?Например, учитывая отсутствие указателя и new (), он объявляется в стеке, как другие локальные переменные, а затем освобождается при возврате функции или сохраняется в куче и поэтому сохраняется?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 14 января 2011

Оба строят объект, но, кроме этого, очень отличаются. Первые строятся в стеке, вторые - в куче. Первая форма должна использоваться везде, где это возможно. Вторая форма должна использоваться тогда и только тогда, когда вам нужно, чтобы объект сохранялся, или он слишком велик для размещения в стеке new - это не «обычная» форма создания объекта в C ++.

3 голосов
/ 14 января 2011

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

function 
{
    RTPIPv4Address adr(2,2);

    return; //adr loses scope and destructor is called    
}

Вот как это обычно размещается в стеке и где он теряет область видимости, но это может случиться и в других местах.

function
{
    if (condition)
    {
        RTPIPv4Address adr(2, 2);

         //do stuff with adr

     } //adr loses scope and destructor is called

    //do more stuff

    return;

}
1 голос
/ 14 января 2011

Первый пример будет размещать ваш объект в стеке. Единственный способ получить что-то в куче - через new (и, очевидно, malloc или другие низкоуровневые операции, такие как mmap).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...