Можно ли объявить указатель на "куче"?

Я использую D для веб-разработки, и это оказалось довольно много более продуктивным по сравнению с C/C++. Существует много платформ на основе ruby/php/python, конечно. Но когда Вы хотите разработать что-то уникальное, которые также должны быть с такой скоростью, как C и почти столь же легки относительно программы с тем, как Вы делаете на многих языках сценария, затем D является хорошим выбором.

11
задан jkeys 13 August 2009 в 20:36
поделиться

5 ответов

int** ppint = new int*;
*ppint = new int;

delete *ppint;
delete ppint;
35
ответ дан 3 December 2019 в 00:58
поделиться

новое T * возвращает указатель на указатель на T. Итак, объявление неверно, оно должно быть:

T** ptr = new T*;

И оно будет находиться в куче.

7
ответ дан 3 December 2019 в 00:58
поделиться

Да, вы можете объявить указатель на указатель ... и да, указатель будет в куче.

4
ответ дан 3 December 2019 в 00:58
поделиться

Вы не можете сделать

T *ptr = new T*;

, поскольку тип возврата new foo - «указатель на foo» или foo * .

Вы можете сделать

T **ptr = new T*;
2
ответ дан 3 December 2019 в 00:58
поделиться

Было упомянуто, зачем вам может понадобиться что-то подобное. На ум приходит динамический массив. (На самом деле это используется в большинстве векторных реализаций.)

// Create array of pointers to object
int start = 10;
SomeObject** dynamic = new SomeObject*[start];
// stuff happens and it gets filled
// we need it to be bigger
{
    SomeObject** tmp = new SomeObject*[start * 2];
    for (size_t x = 0; x < start; ++x)
        tmp[x] = dynamic[x];
    delete [] dynamic;
    dynamic = tmp;
}
// now our dynamic array is twice the size

В результате мы копируем связку указателей для увеличения нашего массива, а не самих объектов.

3
ответ дан 3 December 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: