在从主C ++返回0之后,程序在第二次运行中崩溃

时间:2016-01-18 16:17:52

标签: c++ string visual-studio-2015

我已经构建了自己的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 []。毕竟这是内存泄漏或覆盖。

2 个答案:

答案 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>