Можно ли поместить указатель в кучную память (C ++)? - PullRequest
2 голосов
/ 20 мая 2019

Я написал некоторый код, в котором я попытался создать указатель на Free store (куча памяти).Я думаю, что это невозможно, но я попробовал независимо.

Приведенный ниже код в основном создает вектор указателей в куче, а затем заставляет эти указатели в векторе указывать на некоторые целые числа в куче.Я хочу знать, есть ли в куче те указатели в векторе под названием vec?Я также хотел знать, как правильно освободить пространство, выделенное при использовании вектора, подобного этому.Последний оператор delete приводил к сбою программы, поэтому я закомментировал его.Я не знаю, есть ли утечка памяти.

    vector<int*> *vec = new vector<int*>();
    vec->push_back(new int(1));
    vec->push_back(new int(2));
    vec->push_back(new int(3));
    cout << (*vec)[0] << " " << (*(*(vec))[0]) << endl;
    cout << (*vec)[1] << " " << (*(*(vec))[1]) << endl;
    cout << (*vec)[2] << " " << (*(*(vec))[2]) << endl;
    delete (*vec)[0];
    delete (*vec)[1];
    delete (*vec)[2];
    //delete [] vec;

Ответы [ 4 ]

6 голосов
/ 20 мая 2019

Любая переменная может быть создана в куче, включая указатель.Тем не менее, на уровне C ++ вы не контролируете, где именно создается память.

2 голосов
/ 20 мая 2019

Самое важное, что нужно понять в указателях, это то, что в указателях нет ничего особенного.

Как и все другие векторные элементы, элементы vec находятся в бесплатном хранилище, поскольку там их хранит вектор.

Если вы хотите вручную создать int* в бесплатном хранилище, вы скажете new int*, что, конечно, вернет адрес этого указателя, например,

int** pointer = new int*(nullptr);

Однако на практике это не имеет особого смысла - я не думаю, что видел, чтобы кто-то использовал его в мои двадцать с лишним лет C ++.

0 голосов
/ 20 мая 2019

Если вы хотите выделить память для целого числа, вы можете сказать new int;, как вы это сделали здесь.

Ключевое слово new будет принимать любой (не пустой) тип.Поэтому, если вы хотите выделить указатель (который будет иметь тип int*), вы можете просто сказать: new int*;

Пример (сильно надуманный) может выглядеть следующим образом:

int thing = 7;
int **ptr = new int*(&thing);
std::cout << "**ptr = " << **ptr << std::endl;

Обратите внимание, что, поскольку new будет возвращать адрес, указывающий на какой бы тип мы ни выделяли (в данном случае int*), нам нужно будет присвоить его переменной int**.


* 1017С учетом всего вышесказанного вам вряд ли когда-нибудь понадобится выделить необработанный new int*.Скорее всего, вы столкнулись бы с чем-то похожим, если бы имели дело с динамически размещаемыми многомерными массивами.

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

0 голосов
/ 20 мая 2019

C ++ способ создания указателя в куче выглядит следующим образом: int** pointerToPointer = new int*;

Тип int** может быть прочитан как указатель на указатель.Затем мы используем new для выделения части данных типа int* (указатель int) в куче.

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