Форум программистов, компьютерный форум CyberForum.ru

Несколько new на один и тот же указатель - C++

Восстановить пароль Регистрация
 
Firework
57 / 81 / 21
Регистрация: 01.04.2013
Сообщений: 567
29.09.2015, 14:42     Несколько new на один и тот же указатель #1
C++
1
2
3
4
5
6
7
8
9
10
char* p;
p = new char[5];
strcpy(p, "june");
cout << p << endl;
p = new char[7];
strcpy(p, "august");
cout << p << endl;
p = new char[4];
strcpy(p, "may");
cout << p << endl;
В MSVS 2010 работает. Насколько этот код безопасный? Или же лучше писать delete p перед новым new.
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2015, 14:42     Несколько new на один и тот же указатель
Посмотрите здесь:

Как использовать один и тот же объект в разных классах? C++
C++ Сделать так, чтобы после сортировки вектора указатель показывал на тот же элемент, что и до сортировки
C++ Определить, сколько занятий ведет один и тот де преподаватель
C++ Определить, сколько занятий ведет один и тот же преподаватель
Двоичный поиск в массиве выдает один и тот же ответ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
AlexVRud
414 / 143 / 36
Регистрация: 04.07.2014
Сообщений: 415
29.09.2015, 15:18     Несколько new на один и тот же указатель #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Firework Посмотреть сообщение
Или же лучше писать delete p перед новым new.
Обязательно писать. Иначе происходит "утечка памяти"

Добавлено через 29 минут
Firework. По этой причине, в С++ проще использовать std::string

C++
1
2
3
4
5
6
7
  std::string s;
  s = "one";
  std::cout << s << std::endl;
  s = "two";
  std::cout << s << std::endl;
  s = "three";
  std::cout << s << std::endl;
Firework
57 / 81 / 21
Регистрация: 01.04.2013
Сообщений: 567
29.09.2015, 16:22  [ТС]     Несколько new на один и тот же указатель #3
Цитата Сообщение от AlexVRud Посмотреть сообщение
По этой причине, в С++ проще использовать std::string
Ну это понятно. Я не новичок. Просто если бы можно было использовать библиотеки (в том числе std), то моя задача решалась бы в 2 счёта. Ну может быть в 3 счёта.

Добавлено через 21 минуту
Точно убедился
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int* p;
    p = new int[5];
    for (int i = 0; i < 5; ++i)
        p[i] = i * 2;
    cout << p << endl;
    p = new int[7];
    for (int i = 0; i < 7; ++i)
        p[i] = i * 3;
    cout << p << endl;
    p = new int[4];
    for (int i = 0; i < 4; ++i)
        p[i] = i * 4;
    cout << p << endl;
Разные значения указателя.
А вот процесс, выполняющий этот код
C++
1
2
3
4
char *pointer = NULL;
    for( unsigned long long int i = 0; i < 1024 * 1024; i++ ) {
        pointer = new char[1024];
    }
как раз жрёт гиг оперативки. А если код такой
C++
1
2
3
4
for( unsigned long long int i = 0; i < 1024 * 1024; i++ ) {
        pointer = new char[1024];
        delete pointer;
    }
то меньше мегабайта.
Ника))
 Аватар для Ника))
39 / 39 / 8
Регистрация: 08.12.2010
Сообщений: 338
29.09.2015, 16:32     Несколько new на один и тот же указатель #4
Не понял где связь , ты используешь потоковый вывод cout и говоришь , что тебе запрещено использовать std. В чем логика?
Для справки: видимо на том , на чем ты пишешь свой код подключение STD прописано изначально , к примеру "c++debugger".
AlexVRud
414 / 143 / 36
Регистрация: 04.07.2014
Сообщений: 415
29.09.2015, 17:14     Несколько new на один и тот же указатель #5
Цитата Сообщение от Firework Посмотреть сообщение
Просто если бы можно было использовать библиотеки (в том числе std),
Чем использование стандартной библиотеки Си, будет отличаться от стандартной библиотеки С++.
Ты уже используешь С++, а линковать дополнительные библиотеки для string/vector/shared_ptr/... НЕ НАДО. Они уже все предоставлены (если только не идёт речь о специфичной железке). Если вопрос стоит в взаимодействии с Си-библиотеками, то эти классы имеют все методы для работы с "обычными массивами-ссылками".

С другой стороны в С++ хорошим тоном является перемещение new/delete в конструкторы/деструкторы классов (а это и реализовано в string/vector/shared_ptr/...).

Для примера, реализуй MP1 из https://courses.engr.illinois.edu/cs241/fa2012/, а потом прогони valgrind на получившемся коде. По моей практике, только один студен из группы не допустит утечки памяти.
daslex
29.09.2015, 17:26
  #6

Не по теме:

Список сам собой напрашивается.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.09.2015, 17:55     Несколько new на один и тот же указатель
Еще ссылки по теме:

C++ Один и тот же объект в одном выражении модифицируется несколько раз - неопределенное поведение
C++ Возвращает один и тот же результат. Найти произведение ряда
Генератор паролей создает один и тот же пароль C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Firework
57 / 81 / 21
Регистрация: 01.04.2013
Сообщений: 567
29.09.2015, 17:55  [ТС]     Несколько new на один и тот же указатель #7
Цитата Сообщение от Ника)) Посмотреть сообщение
Не понял где связь , ты используешь потоковый вывод cout и говоришь , что тебе запрещено использовать std.
Контейнеры нельзя использовать (vector, string, list)
Yandex
Объявления
29.09.2015, 17:55     Несколько new на один и тот же указатель
Ответ Создать тему
Опции темы

Текущее время: 13:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru