2013-11-10 3 views
0

В чем разница между этими двумя методами?новое динамическое распределение против нормального распределения

Method(CustomClass t) 
{ 
CustomClass *temp = &t; 
} 

называют как этот

Method(CustomClass(1,2,3)); 

и

Method(CustomClass* t) 
{ 
CustomClass *temp = t; 
} 

называется как этот

Method(new CustomClass(1,2,3)); 

я не закодированы в C++ в течение нескольких лет, и я с некоторые проблемы с запоминанием. Я прихожу из C#, где каждый класс должен быть динамически распределен с помощью «нового». Дело в том, что я не согласен с разницей между динамическим распределением объекта с «новым» и вызовом его в обычном режиме. Как temp отличается в двух примерах?

Более конкретный пример: я создавал связанный список и мой список я имел этот метод:

void List::AddNew(TestClass node) 
{ 
    if (!first) 
    { 

     first = &node; 
    } 
    else 
    { 
     bool setFirst = false; 
     if (!last) 
      setFirst = true; 

     TestClass *temp; 
     temp = last; 
     last = &node; 

     if (temp) 
     temp->next = last; 

     if (setFirst) 
     first->next = last; 
    } 


} 

где first и last являются TestClass *; список не был инициализирован правильно (первый и последний указывал на то же значение), и я понятия не имел, почему, поэтому я изменил способ это:

void List::AddNew(TestClass* node) 
{ 
    if (!first) 
    { 

     first = node; 
    } 
    else 
    { 
     bool setFirst = false; 
     if (!last) 
      setFirst = true; 

     TestClass *temp; 
     temp = last; 
     last = node; 

     if (temp) 
     temp->next = last; 

     if (setFirst) 
     first->next = last; 
    } 


} 

и теперь он работает. Мне не хватает базового принципа для указателей, и я не могу догадаться, что это так.

Здесь TestClass также:

class TestClass 
{ 
public: 
    int x, y; 
    TestClass *next; 
    TestClass *prev; 
    TestClass(); 
    TestClass(int,int); 
    ~TestClass(); 

}; 

ответ

0

CustomClass * Темп; temp - это только указатель. Он указывает на NULL (нормально, на самом деле он может указывать повсюду, но вы должны установить его в NULL, если объект не существует) или уже существующий класс.

CustomClass tmp; Создает объект.

Метод (CustomClass * t): Требования для уже существующего объекта (t = указатель на существующий объект).

CustomClass * temp = t; Назначает указатель на новый локальный указатель.

Метод (CustomClass т): Если создать копию класса вы передаете (не уверен ...)

CustomClass * температура = & т; & = Адрес-оператор. Извлекает адрес t и сохраняет его в локальной точке указателя.

MFG

1

чем разница между этими двумя методами?

Один из них использует распределение стека (автоматического), в то время как другое использует распределение кучи (динамическое).

Method(CustomClass(1,2,3)); // stack based 

Method(new CustomClass(1,2,3)); // heap based 

Если вы собираетесь использовать new вы должны убедиться, что вы delete что ссылки также. В противном случае у вас будет утечка памяти.

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

Срок службы объекта. Если вы поместите что-то в стек, вы сможете использовать его только в определенной функции, и любые функции, находящиеся под ним, должны будут передаваться в качестве параметра. Если вы положите его в кучу, вы можете вернуть ссылку на нее и использовать ее там, где хотите. Вы не можете вернуть ссылку/адрес в переменную стека, так как она заканчивается, когда функция возвращается.

+0

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

+0

И вы должны убедиться, что вы не выбрали никаких исключений до того, как вместо 'delete', IOW используйте' std :: unique_ptr'. (Или просто возьмите 'const &' действительно.) – rightfold

+0

@BadescuAlexandru время жизни объекта. Если вы поместите что-то в стек, вы сможете использовать его только в определенной функции, и любые функции, находящиеся под ним, должны будут передаваться в качестве параметра. Если вы положите его в кучу, вы можете вернуть ссылку на нее и использовать ее там, где хотите. Вы не можете вернуть ссылку/адрес в переменную стека, так как она заканчивается, когда функция возвращается. – yamafontes

1

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

T* t = &t; 

Не является выделение кучи. Это просто указатель с продолжительностью автоматического хранения (в стеке), указывающий на другой объект в стеке (если t сам по себе основан на стеке). Распределение в куче происходит только тогда, когда используется new.

Смежные вопросы