Если указатели могут динамически изменять размер массивов во время выполнения, почему необходимо инициализировать массив размером? - PullRequest
2 голосов
/ 06 октября 2011

Например:

int* pArray;
pArray = new array[];

вместо:

int* pArray;
pArray = new array[someNumber];

Поскольку указатели могут динамически изменять размер массива во время выполнения и имя указателя указываетк первому элементу массива, не должен ли размер по умолчанию быть [1]?Кто-нибудь знает, что происходит за сценой?

Ответы [ 8 ]

10 голосов
/ 06 октября 2011

Поскольку указатели могут динамически изменять размер массива во время выполнения

Это не правда. Они не могут изменить размер, если вы не выделите новый массив с новым размером.

Если вы хотите иметь массивоподобный объект, который динамически изменяет размер, вы должны использовать std::vector.

#include<vector>
#include<iostream>

...
std::vector<int> array;

array.push_back(1);
array.push_back(2);
array.push_back(3);
array.push_back(4);

std::cout << array.size() << std::endl; // should be 4
1 голос
/ 06 октября 2011

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

Когда вы «изменяете размер» массива, вы создаете новый массив (один с еще большим объемом памяти) и копируете элементыперед удалением старого массива (или если у вас утечка памяти).

0 голосов
/ 06 октября 2011

За кулисами выделяется память, маленький кусочек кремния где-то в вашей машине теперь выделен массиву, который вы только что new отредактировали.

Когда вы хотите «изменить размер» вашего массива, это можно сделать только вместо , если кусок кремния имеет свободное пространство вокруг него. В большинстве случаев вместо этого необходимо зарезервировать другой, больший, кусок и скопировать данные, которые были в первом ... и, очевидно, отказаться от первого (в противном случае у вас есть утечка памяти).

Это выполняется автоматически контейнерами STL (например, std::vector или std::deque), но вручную, когда вы сами вызываете new. Поэтому лучшее решение, позволяющее избежать утечек, - это использовать стандартную библиотеку, а не пытаться эмулировать ее самостоятельно.

0 голосов
/ 06 октября 2011

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

0 голосов
/ 06 октября 2011

int *pArray = new int; можно считать массивом размера 1, и он делает то, что вы хотите "по умолчанию".

Но что, если мне нужен массив из 10 элементов? У указателей нет магических способностей, они просто указывают на память, поэтому:

pArray[5] = 10; просто выдаст ошибку времени выполнения (если вам повезет).

Поэтому существует возможность выделить массив нужного размера, вызвав new type[size].

0 голосов
/ 06 октября 2011

Указатели указывают на динамически выделяемую память.Память находится в куче, а не в стеке.Он динамический, потому что вы можете вызывать new и удалять его, добавляя и удаляя из него во время выполнения (в простых терминах).Указатель не имеет к этому никакого отношения - указатель может указывать на что угодно, и в этом случае он просто указывает на начало вашей динамической памяти.Изменение размера и управление этой памятью полностью является вашей ответственностью (или ответственностью контейнера, который вы можете использовать, например, std :: vector управляет динамической памятью и действует как динамический массив).

0 голосов
/ 06 октября 2011

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

Однако я предлагаю вам держаться подальше от всего, что связано с new, пока вы не узнаете больше о языке.Для массивов, изменяющих их размер динамически, используйте std::vector.

0 голосов
/ 06 октября 2011

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

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