В чем разница между этими двумя методами?новое динамическое распределение против нормального распределения
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();
};
Да, я знаю это, но что такое ** реальное ** дефференцирование между распределениями и когда я должен использовать тот или иной? почему мой пример работает, когда я передаю динамически распределенное значение, а не когда я передаю выделенный стек? – Alex
И вы должны убедиться, что вы не выбрали никаких исключений до того, как вместо 'delete', IOW используйте' std :: unique_ptr'. (Или просто возьмите 'const &' действительно.) – rightfold
@BadescuAlexandru время жизни объекта. Если вы поместите что-то в стек, вы сможете использовать его только в определенной функции, и любые функции, находящиеся под ним, должны будут передаваться в качестве параметра. Если вы положите его в кучу, вы можете вернуть ссылку на нее и использовать ее там, где хотите. Вы не можете вернуть ссылку/адрес в переменную стека, так как она заканчивается, когда функция возвращается. – yamafontes