Это хорошее использование / код массивов с указателями в C ++? - PullRequest
0 голосов
/ 30 ноября 2018

Я хотел бы спросить вас, думаете ли вы об этом коде, является ли он абсолютно плохим или я плохо использую память

Это код

// Ask for capacity
int capacity ;
cout << "capacity: ";
cin >> capacity;

// Declare the array with pointers, this line is very important
int *arr = new int;

// For 0 until capacity-1 print ask for the numbers
for (int i = 0; i < capacity; i++)
{
  cout << "number: ";
  cin >> *(arr + i);
}

// Print them
for (int i = 0; i < capacity; i++)
{
  cout << "[" << i << "]: " << *(arr + i) << " in " << arr + i << endl;
}

И это пример вывода

capacity: 9
number: 1
number: 2
number: 3
number: 4
number: 5
number: 6
number: 7
number: 8
number: 9
[0]: 1 in 0x55dee480c690
[1]: 2 in 0x55dee480c694
[2]: 3 in 0x55dee480c698
[3]: 4 in 0x55dee480c69c
[4]: 5 in 0x55dee480c6a0
[5]: 6 in 0x55dee480c6a4
[6]: 7 in 0x55dee480c6a8
[7]: 8 in 0x55dee480c6ac
[8]: 9 in 0x55dee480c6b0

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

int * arr = new int

Это нормально?

то же самое с этим кодом, но это может быть немногонемного хуже, потому что это строка, массив символов, как вы, возможно, знаете

// Declaring the pointer name as new char and ask for it
char *name = new char;
cout << "name in: ";
cin >> name;
cout << "name out\n";
for (int i = 0; *(name + i) != '\0' ; i++)
{
  printf("[%i]: %c\n", i, *(name + i));
}

Пример:

name in: Gilberto       
name out
[0]: G
[1]: i
[2]: l
[3]: b
[4]: e
[5]: r
[6]: t
[7]: o

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Необработанные (владеющие) указатели и ручное управление памятью - почти никогда хорошая идея в современном C ++.Вы должны использовать контейнеры типа std::array и std::vector, а не массивы в стиле C.А владение и срок службы динамических ресурсов намного лучше моделируются с помощью интеллектуальных указателей, таких как std::unique_ptr, std::shared_ptr & std::weak_ptr, а не необработанных указателей.Не пишите код, который легко ошибиться.Используйте имеющиеся у нас возможности для написания кода, который легко получить правильно и трудно (er), чтобы ошибиться.

0 голосов
/ 30 ноября 2018

Код выделяет только один int объект.Исправление:

int* arr = new int[capacity];

*(arr + i) может быть проще: arr[i].


Код должен удалить массив в конце:

delete[] arr;

Или, что лучше, используйте умный указатель, чтобы избежать необходимости удалять вручную:

std::unique_ptr<int[]> arr(new int[capacity]);

Или, что еще лучше, используйте std::vector<int> arr(capacity);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...