2013-12-16 3 views
0

Я создал эту простую функцию.Управление памятью C++

char* tmp = new char[len]; 
strncpy(tmp,str+start,len); 
int ret = atoi(tmp);  
delete []tmp; 
return ret; 

У меня проблема с управлением памятью. Когда я читаю переменную ret, значение равно null. Если я удалю инструкцию «delete [] tmp;» значение верное, но память быстро увеличивается (потому что я не освобождаю память).

Любые идеи? Thanks

+2

use 'std :: string' –

+0

std :: string и stringstream для преобразования, вы смешиваете C с C++ – Lefsler

+0

Я должен использовать Char *. – zp26

ответ

0

Что вы можете сделать, так это выделить буфер из-за пределов функции и передать аргумент tmp в виде массива. Однако лучше всего выделить объект. Они разрушаются до тех пор, пока вы не используете новое ключевое слово. std::string был бы идеальным в этом сценарии.

0

Убедитесь, что tmp прекращается с '\0'

+1

uh, поэтому OP 'удаляет свои данные перед возвратом. Я думаю, что это наименьшее из его проблем. –

+0

Нет, OP не возвращает 'tmp', но' ret' – chill

+0

oops. Извините, немного замалчивается ** **. Тем не менее, я не получаю сообщение OP. Как может 'int' быть нулевым? –

1

От человека strncpy: Функция strncpy() аналогична чем зЬгсру, за исключением того, что в большинстве п байтов ЦСИ копируются. Предупреждение. Если среди первых n байтов src нет нулевого байта, строка, помещенная в dest, не будет заканчиваться нулем.

Проверьте переменную длину str и проверить это нуль завершающего condicion на strncpy

1

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

Также обратите внимание, что strncpy может не прерывать строку в некоторых случаях. И чтобы вы могли выделить один дополнительный символ (len + 1) для терминатора.

1

strncpy заполняет целевой массив символом '\ 0, как только будет достигнут конец источника.

atoi ожидает нулевую завершенную c-строку, означает массив символов, который заканчивается символом '\ 0'.

Поэтому вам необходимо создать массив размером len + 1, функция strncpy будет автоматически завершать нулевой целевой массив.

0

Сложно сказать, что не так с str и len не показаны.

Эта функция может быть намного проще:

int ret = atoi(str + start);  
return ret; 

КСТАТИ ret является int и NULL обычно называют указателями.

+2

Не работает, потому что 'atoi' не знает, где остановить разбор исходной строки. – maxdev

+1

Он остановится на первом символе, который не является цифрой, пробелом или знаком +. [См. Здесь] (http://www.cplusplus.com/reference/cstdlib/atoi/) – egur

+1

Проблема в том, что вы хотите остановить ее после символов 'len' максимум. – Liviu

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