Я пишу программу, в которой у меня есть один класс, внутри этого класса (или снаружи, надеюсь, это не имеет значения) у меня есть структура. В этом классе мне нужно создать массив элементов структуры (я знаю, что могу использовать вектор, например, но в программе разрешено использовать только простые динамические массивы).
Я объявляю массив как T * arr[SIZE]
, где T
— моя структура. Единственная проблема в том, что я не знаю точного размера массива и мне нужно увеличить его размер, если это необходимо. Поэтому я написал функцию для изменения размера:
if( some cond ){
T * tmpArr[newSIZE];
memcpy( tmp, db, newSIZE*sizeof(T));
delete [] arr;
arr = tmpArr;
}
Но я получаю сообщение об ошибке, что MyClass::T[....]
несовместимо с MyClass::T*[SIZE]
, что, я думаю, отвечает моему выражению arr = tmpArr
.
Можете ли вы сказать мне, что я делаю неправильно? И как лучше объявить T * arr[size]
или T * arr = new T[size]
и как в этом случае изменить размер (и освободить память от старого) массива?
ОБНОВИТЬ:
Спасибо за ответы, я сделал соответственно в своей программе:
T * tmp = new T[newSIZE];
memcpy( tmp, db, newSIZE*sizeof(T) );
delete [] db;
db = tmp;
И теперь я получаю странные вещи, после удаления db и назначения db
tmp
я пытаюсь распечатать все данные, содержащиеся в db (или tmp), эта странная вещь, которую я получаю:
Smith2 Michigan ave▒ ACME, Ltd. One ACME roa▒
Smit▒ Michigan ave` ACME, Ltd. One ACME roa "
One ACME road#@"▒▒▒▒Michigan ave`▒▒▒▒Smit▒"
▒▒ ▒8 Ltd.#Michigan avenuemith4▒aF▒
Если я распечатаю те же данные перед удалением и назначением, я получу обычный текст, который хочу. И после того, как в программе (поскольку у меня не было раньше и, возможно, это проблема с моим кодом, я получаю ошибку сегментации). Кстати, я использую struct
из std::string
и cygwin в своих окнах. Вы хоть представляете, в чем здесь проблема?
tmpArr
представляет собой массив указателей. Это выглядит нежелательно. Но опять же, весь код немного бессмысленный. - person Kerrek SB   schedule 25.03.2013std::vector
. :( - person Xymostech   schedule 25.03.2013