2012-04-15 2 views
0

Надеюсь, это не является основополагающим вопросом. Я интересно, если есть разница между выполнениемНазначение нового объекта переменной в цикле for в C++

while (1) { 
    int *a = new int(1); 
    // Do stuff with a 
} 

в отличие от

int *a; 
while (1) { 
    a = new int(1); 
    // Do stuff with a 
} 

В обоих случаях одинаковое количество объектов динамически выделяемых средств. Но влияет ли тот факт, что ключевое слово int внутри цикла в первом примере влияет на используемую память?

+2

Есть ли причина, по которой вы используете 'new' здесь? – Pubby

+0

У меня был класс контейнера, которому нужны динамически выделенные объекты. А также мне было просто любопытно. – gsingh2011

ответ

4

Разница scope.

while (1) { 
    int *a = new int(1); 
    // Do stuff with a 

    // Don't forget to delete a. 
} 

// Cannot access `a` here... 

Принимая во внимание:

int *a; 
while (1) { 
    a = new int(1); 
    // Do stuff with a 

    // Don't forget to delete a. 
} 

// Can access `a` here. 

Вы a memory leak в обоих ваших примерах. Предпочитаете smart pointers!

+0

Хорошо, я не был уверен, была ли ссылка на a воссоздана каждая итерация цикла в первом примере. И да, подразумевалось, что delete a находится где-то в // Делайте материал с помощью. Благодарю. – gsingh2011

+0

Я не думал, что это подразумевалось. Что вы на самом деле пытаетесь сделать? – Johnsyweb

+0

Мне нужно было использовать класс контейнера, который принимал только динамически выделенные объекты. И мне было любопытно, что происходит с переменной 'a'. Во втором примере использовалась одна и та же ссылка, но в первом я не был уверен, были ли созданы новые ссылки в памяти, а старые - в стеке, пока программа не выйдет. Из того, что вы говорите, используется одна и та же ссылка, хотя я переопределяю ее как int? – gsingh2011

4

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

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