管理内存C ++

时间:2013-12-16 11:30:41

标签: c++ memory-management

我已经创建了这些简单的功能。

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

我遇到内存管理问题。 当我读取ret变量时,该值为null。如果我删除指令“delete [] tmp;”值是正确的,但内存快速增加(因为我没有释放内存)。

有什么想法吗? 感谢

6 个答案:

答案 0 :(得分:1)

来自man strncpy:strncpy()函数与strcpy类似,只是复制了src的最多n个字节。警告:如果src的前n个字节中没有空字节,则放在dest中的字符串将不会以空值终止。

检查str变量长度并验证此空格终止strncpy

答案 1 :(得分:1)

atoi存在一些问题,其中之一是它没有任何验证,你传递的字符串实际上是一个数字。相反,您可能希望改为使用strtol

另请注意,strncpy在某些情况下可能不会终止字符串。并且您可能希望为终结符分配一个额外的字符(len + 1)。

答案 2 :(得分:1)

strncpy一旦到达源的末尾,就用'\ 0'填充目标数组。

atoi期望空终止的c-string,表示以'\ 0'结尾的字符数组。

因此,您必须创建一个大小为len + 1的数组,strncpy函数将自动空终止您的目标数组。

答案 3 :(得分:0)

您可以做的是从函数外部分配缓冲区,并将tmp参数作为数组传递。但更好的方法是分配一个对象。只要您不使用new关键字,这些就会被破坏。 std::string在这种情况下会很完美。

答案 4 :(得分:0)

确保使用tmp

终止'\0'

答案 5 :(得分:0)

很难说出自strlen未显示以来出现了什么问题。

这个功能可以简单得多:

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

BTW,retint,NULL通常被称为指针。