Вопрос

Это метод для создания переменной в куче в C ++:

T *ptr = new T;

ptr, очевидно, ссылается на указатель на новый T.Мой вопрос в том, можете ли вы это сделать:

T *ptr = new T*;

Похоже, это может привести к какому-то очень, очень опасному коду.Кто-нибудь знает, возможно ли это / как правильно это использовать?

Это было полезно?

Решение

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

delete *ppint;
delete ppint;

Другие советы

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

T** ptr = new T*;

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

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

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

// 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

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

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

T *ptr = new T*;

поскольку возвращаемый тип new foo является "указателем на foo" или foo *.

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

T **ptr = new T*;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top