我已经构建了自己的strlen和strdup函数。 当我第一次使用我的strdup它没关系时,我关闭窗口,再次运行它,然后在程序结束后从主程序返回0程序崩溃。 VS只是说它触发了一个断点。
#include "stdafx.h"
#include <iostream>
using namespace std;
int MyStrlen(const char* str);
char* MyStrdup(const char* str);
int main()
{
char *s1 = "Hello World!";
char *s2 = MyStrdup(s1);
cout << s1 << " , " << s2 << endl;
system("pause");
return 0;
}
int MyStrlen(const char* str)
{
register int iLength = 0;
while (str[iLength] != NULL)
{
iLength++;
}
return iLength;
}
char* MyStrdup(const char* str)
{
char* newStr;
int strLength = MyStrlen(str);
newStr = new char(strLength+1);
for (register int i = 0; i < strLength; i++)
{
newStr[i] = str[i];
}
newStr[strLength] = NULL;
return newStr;
}
有人可以注意到它崩溃的地方吗?我认为这可能是内存泄漏。 另外,您能否注意到代码中需要改进的内容?为了我的学习目的
编辑:谢谢,我不知道为什么我使用()代替[]来定义我的新char []。毕竟这是内存泄漏或覆盖。答案 0 :(得分:11)
&#34; new&#34;数组的语句应该用方括号:
newStr = new char[strLength+1];
当你这样做时
new char(c)
它分配一个字符并将字符c复制到其中。 当你这样做
new char[n]
为n个字符分配内存
答案 1 :(得分:4)
表达式new char(strLength+1)
分配单个字符,并将其初始化为strLength + 1
。这当然意味着当你复制字符串时,你会写出界限并且有未定义的行为。
您应该使用new char[strLength + 1]
来分配&#34;数组&#34;人物。
在一个不相关的注释中,虽然字符串中的终止字符通常称为 null 字符,但它实际上并不是null 指针(这是什么NULL
是为了)。这并不重要,因为在C ++中NULL
是一个扩展为0
的宏,但你可能应该是明确的并且无论如何都要使用'\0'
(它为未来的读者提供了更多的背景)。 / p>