Форум русскоязычного сообщества Ubuntu


Автор Тема: Операция new  (Прочитано 558 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн tro9an

  • Автор темы
  • Любитель
  • *
  • Сообщений: 55
    • Просмотр профиля
Операция new
« : 10 Май 2011, 23:57:25 »
Здравствуйте, хотелось бы уточнить кое-что про операцию new. Допустим пользователь вводит строку, и чтобы не разбрасываться памятью надо знать точное количество символов. Но точное количество мы узнать не можем, мало ли какой пользователь попадётся. Значит можно сделать так:
#include <iostream>
#include <cstring>
using namespace std;

const int MAX = 40;

int main ( )
 {
   char str [ MAX ];
   cin >> str;

   int len = strlen ( str );
   char *str2 = new char [ len + 1 ];
   strcpy ( str2, str );
   
   return 0; //это всё при условии что строка не больше 39 символов
 }

Допустим строка состоит из десяти символом, получается отсальные 30 ( из 40 отведённых ), пропадают даром, но тут на помощь приходит операция new, и, так сказать, бронирует 10 "ячеек". А теперь вопрос:
На самом ли деле он бронирует эти десять "ячеек"?
Тоесть остальные 30 ( памяти ) можно использовать совершенно для других целей?

Оффлайн Not eXist

  • Активист
  • *
  • Сообщений: 916
    • Просмотр профиля
Re: Операция new
« Ответ #1 : 11 Май 2011, 00:30:14 »
Тоесть не нужно срадать фигнёй:
Во-первых, откройте для себя класс string (раз вы уже пытаетесь писать на C++);
Во-вторых, не нужно управлять памятью руками(читать про RAII и умные указатели), это не критично на таком коде, но в дальнейшем убережёт от кучи проблем.

Оффлайн tro9an

  • Автор темы
  • Любитель
  • *
  • Сообщений: 55
    • Просмотр профиля
Re: Операция new
« Ответ #2 : 11 Май 2011, 01:54:43 »
откройте для себя класс string;

Я в курсе, но автор учебника хочет чтобы программа была написана без string.
Вы не ответили на мой вопрос.

andrey_p

  • Гость
Re: Операция new
« Ответ #3 : 11 Май 2011, 05:54:51 »
Мда, старею, тупею видимо... :( Три раза перечитал вопрос, так и не понял, что надо.

Но я бы, прежде, чем думать о том, кто, для кого, зачем и чего "бронирует", если введено меньше символов, поинтересовался бы, что произойдет, если ввести больше 40 символов. (Что видимо и требовалось, судя по return 0; //это всё при условии что строка не больше 39 символов).





Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Операция new
« Ответ #4 : 11 Май 2011, 06:04:36 »
В общем случае когда не известно какой длины сообщение придёт память выделяют частями или фиксированными или сначала для заголовка в котором будет указана реальная длина сообщения а потом уже добавляют необходимый размер памяти.
std::cin это уже буферизованный ввод. стоит пользоваться std::string (или лучше std::wstring) если тебе так категорически необходимо читать в память фиксированного размера то для этого существуют другие функции и методы. Почитай документацию на подсистему потокового ввода/вывода STL что ли.

Кстати, память из под str2 надо освобождать с помощью конструкции delete [] str2; это я тебе заранее пока ты не ляпнул еще одну идиотскую ошибку.

А вообще я тоже как и andrey_p поржал над твоим условием не больше 40 символов.

Оффлайн Vovaldo

  • Любитель
  • *
  • Сообщений: 82
  • Ху Тин Пуй
    • Просмотр профиля
    • Путин забрал у Медведева инновационный орган
Re: Операция new
« Ответ #5 : 11 Май 2011, 06:53:18 »
Здравствуйте, хотелось бы уточнить кое-что про операцию new. Допустим пользователь вводит строку, и чтобы не разбрасываться памятью надо знать точное количество символов. Но точное количество мы узнать не можем, мало ли какой пользователь попадётся. Значит можно сделать так:
#include <iostream>
#include <cstring>
using namespace std;

const int MAX = 40;

int main ( )
 {
   char str [ MAX ];
   cin >> str;

   int len = strlen ( str );
   char *str2 = new char [ len + 1 ];
   strcpy ( str2, str );
   
   return 0; //это всё при условии что строка не больше 39 символов
 }

Допустим строка состоит из десяти символом, получается отсальные 30 ( из 40 отведённых ), пропадают даром, но тут на помощь приходит операция new, и, так сказать, бронирует 10 "ячеек". А теперь вопрос:
На самом ли деле он бронирует эти десять "ячеек"?
Тоесть остальные 30 ( памяти ) можно использовать совершенно для других целей?
Интересно, а ты вообще-то понял, что выделенные операцией new 10 "ячеек" ( :D ) на которые указывает str2, никак не связаны с 40-ка, которые отведены под str ?

Оффлайн S_F_H

  • Участник
  • *
  • Сообщений: 129
  • Да будет crossplatform!
    • Просмотр профиля
Re: Операция new
« Ответ #6 : 11 Май 2011, 13:59:22 »
чтоб использовать остальные, надо выравнивание памяти делать. функция malloc отвечает за это действие. и потом, использовать ты сможешь не 30 а 29 символов, так как программа после введенных символов сама ставит в конец знак окончания строки /0. кажется так.

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: Операция new
« Ответ #7 : 12 Май 2011, 10:06:50 »
S_F_H, Какое нафиг выравнивание?
1) лучше не комментировать работу с памятью если с терминирующим ноликом не уверен
2) malloc отвечает за выделение памяти. на сколько она там будет выровнена это дело десятое и сейчас совсем не об этом
3) ты сам понял че ляпнул? иди читай мануалы и учи мат. часть. Выровнена она ему.

 

Страница сгенерирована за 0.234 секунд. Запросов: 24.