2013-08-06 10 views
1

Я пишу простую функцию для слияния двух C-строк. При попытке динамически alocate нового блока памяти я узнал, что:Новое выделяет слишком много памяти

char * out = new char[size]; 
std::cout << strlen(out) <<std::endl; 

Возвращает 16, когда размер 4 и 40, когда размер 22 и так далее. У кого-нибудь есть идея, почему он действует так и как распределять память для c-строки с определенным количеством символов?

+1

Вы не инициализируете строку. 'strlen()' нуждается в 0-концевом буфере. Спрошено столько раз ... –

+2

Yup - как только я вижу strlen() в вопросе .... –

+0

Непонятно, что это дубликат предлагаемого оригинала. Этот вопрос касался применения 'strlen' к массиву, который был инициализирован, но который не содержал завершающий нулевой символ. Этот вопрос применяет 'strlen' к массиву, который не инициализирован. Непонятно, возникает ли путаница в отношении того, как работает «strlen» или о том, инициализирует ли и как «новый» массив, выделенный таким образом. –

ответ

0

Использование new для выделения памяти не инициализирует память:

char * out = new char[size]; 

// Add this code to initialize out 
memset(out,'A',size-1); 
out[size-1]='\0'; 

std::cout << strlen(out) <<std::endl; 
+1

Технически, 'new char [size]()' все еще использует 'new' и делает. – chris

+0

Это всего лишь фрагмент кода. После этого у меня есть for-loop, который помещает точное число (равное переменной 'size') символов в 'out' char *. И например, вместо того, чтобы иметь строку «aabb», у меня есть «aabbrrrrzzzzzzzz» – pawels1991

+1

@ pawels1991, есть ли какой-либо из них нулевой терминатор? – chris

5

Выделенная память не инициализируется. strlen() просто продолжает заряжать память, пока не встретит нулевой символ ('\0'). Поскольку вы не инициализировали память, на которую указывает out, содержимое этой памяти не определено, и поэтому так происходит поведение strlen().

strlen()не измерить размер в распределении, так что ваша интерпретация, что new выделяет слишком много памяти неверна просто потому, что инструмент используется для измерения размера выделения не делает это вообще.

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

+0

'new' инициализирует некоторые объекты, которые он создает, а не другие, поэтому было бы полезно объяснить, почему это распределение не инициализирует выделенную память. –

Смежные вопросы