Массивы и указатели - PullRequest
       4

Массивы и указатели

0 голосов
/ 11 июня 2010

Нужна помощь с массивами и указателями и объяснением того, что я пытаюсь сделать.Я хочу создать новый массив в куче типа Foo *, чтобы впоследствии я мог назначить объекты, которые были созданы где-то еще в этом массиве.У меня возникают проблемы с пониманием того, что я создаю, именно тогда, когда я делаю что-то вроде следующего.

Foo *(*f) = new Foo*[10];

Также после того, как я создал свой массив, как мне получить доступ к каждому элементу, например.

(f + 9)->fooMember(); ??????

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 11 июня 2010
Foo *(*f) = new Foo*[10];

Скобки в объявлении не нужны, так что это то же самое, что и

Foo **f = new Foo*[10];

В любом случае new Foo*[10] выделяет место для десяти Foo* с и оставляет их неинициализированными. Он возвращает указатель на начальный Foo* в массиве (нулевой элемент), который вы присваиваете f.

Для доступа к элементам массива вы просто используете подписку:

f[0] = new Foo;
f[0]->fooMember();

Помните, что все, что вы создаете с помощью new[], должно быть освобождено один раз, когда вы закончите с этим, вызвав delete[] на указателе. Например:

delete[] f;

Это не удаляет элементы, на которые указывают Foo* s в массиве. Если вы создаете Foo объекты, используя new, вы должны delete их до , чтобы удалить массив. Например, чтобы освободить элемент, который мы создали выше:

delete f[0];
1 голос
/ 11 июня 2010

Массивы и указатели не очень C ++.Как насчет

std::vector<std::shared_ptr<Foo> > f;
f.push_back(std::make_shared<Foo>(whatever, arguments, you, need));
// ...
f[9]->fooMember();
// ...

Ручная очистка не требуется: -)

1 голос
/ 11 июня 2010

В такой ситуации может оказаться полезным следующий фрагмент кода:

Первая инициализация:

Foo** f = new Foo*[10];
for (int i = 0; i < 10; i++) {
    f[i] = new Foo;
}

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

f[9]->fooMember();

Наконец, чтобы сохранить порядок и предотвратить утечку памяти:

for (int i = 0; i < 10; i++) {
    delete f[i];
}
delete[] f;
1 голос
/ 11 июня 2010

Вы можете создать массив указателей, используя следующий код:

Foo** f = new Foo*[10];

Затем получите доступ к элементам с помощью:

f[9]->fooMember();

Обязательно почистите потом:

delete[] f;

Спасибо.

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