Добавляйте новые объекты после использования «new» - PullRequest
0 голосов
/ 18 января 2011

после вызова new, как я могу добавить больше объектов в указатель?(Мне это нужно для занятий) вот что я имею в виду:

int *a;
a = new int;
a = new int;

Большое спасибо!

Ответы [ 4 ]

3 голосов
/ 18 января 2011

Вы, вероятно, должны использовать вектор или список .

2 голосов
/ 18 января 2011

В C вы бы использовали realloc. В C ++ вы бы использовали STL std::vector вместо указателя. Вы всегда можете сделать что-то ужасное, например:

int *a;
a = new int[1];
delete [] a;
a = new int[2];

Но вы бы упали производительность.

0 голосов
/ 18 января 2011

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

int * a; // original pointer
a = new int[5]; // just five elements

Теперь, чтобы увеличить его до 10 элементов (создать новый массив, скопировать старое содержимое, восстановить память старого массива и переназначить указатель массива):

int * tmp = new int[10]; // a new array
memcpy (tmp, a, 5 * sizeof(int)); // copy the old items into the new array
delete [] a; // reclaim the memory from the old array
a = tmp; // reassign a to point to the new, bigger array

См. Cormen, Leiserson, Rivest and Stein , глава 17.4, для описания и анализа такой "динамической таблицы".

0 голосов
/ 18 января 2011

Если вам нужен непрерывный буфер, используйте vector.

std::vector<int> buf;
buf.push_back( 1 );
buf.push_back( 2 );
buf.push_back( 3 );

int * intbuf = &buf[0];

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

buf.reserve( 65536 );

или какой-то другой номер. Вы все еще можете добавить более 65536 элементов в вектор, но гарантируется, что до тех пор, пока размер меньше этого, & buf [0] не изменится.

Учитывая, что вы ничего не делаете, вы пытаетесь реализовать вектор, один из способов сделать это - вообще не использовать new, а использовать malloc для выделения памяти, таким образом:

char * buf = static_cast<char *>( malloc( BUF_SIZE ) );

Теперь вы можете создавать объекты здесь с размещением новых

int * intbuf = new( buf + sizeof(int) * N ) int( i );

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

bufNew = static_cast< char * >( realloc( buf, newBufSize ) );
if( bufNew )
     buf = bufNew;

Это работает здесь, потому что int является типом POD. Если тип не POD, перераспределение и перемещение объектов по памяти небезопасно, вам нужно переместить их как объекты, используя operator = для каждого из них.

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

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