从malloc过渡到New

Transition from malloc to New

本文关键字:New 过渡到 malloc      更新时间:2023-10-16

我一直在和一位导师一起做我的一项作业,他们在作业中使用了我的malloc。我的教练告诉我应该用新的。为了在两者之间转换,我想确保我做得正确。

我所拥有的(几个例子);

char* songTitle = (char*)malloc(sizeof(char)* 50);
songTitle = (char*)malloc(sizeof(char)* 50);
title = (char*)malloc(sizeof(char)* 50);

我希望过渡是正确的;

char* songTitle = new char[50];
songTitle = new char[50];
title = new char [50];

我正在使用的示例片段;

代码段#1

cin.ignore();
cout << "What is the title of the song? " << endl;
char* songTitle = (char*)malloc(sizeof(char)* 50);
cin.getline(songTitle, 50);
songTitle[0] = std::toupper(songTitle[0]);
for (std::size_t i = 1; i < strlen(songTitle); ++i)
    songTitle[i] = std::tolower(songTitle[i]);

代码段#2

cin.ignore();
cout << "What is the title of the song? " << endl;
songTitle = (char*)malloc(sizeof(char)* 50);
cin.getline(songTitle, 50);
songTitle[0] = std::toupper(songTitle[0]);

代码段#3

while (true && count < ARRAY_SIZE)
    {
        title = (char*)malloc(sizeof(char)* 50);
        artist = (char*)malloc(sizeof(char)* 50);
        duration = (char*)malloc(sizeof(char)* 50);
        album = (char*)malloc(sizeof(char)* 50);
        inFile.getline(title, 50, '|');
        songs[count].setTitle(title);
        inFile.getline(artist, 50, '|');
        songs[count].setArtist(artist);
        inFile.getline(duration, 50, '|');
        songs[count].setDuration(duration);
        inFile.getline(album, 50, '|');
        songs[count].setAlbum(album);
        if (inFile.eof() == true)
            break;
        count++;
    }

OP已经声明,它们被char数组卡住了。这是不幸的,但在上述所有情况下,似乎根本不需要任何动态分配。滥用旧功夫教学的危害程度不断升级,先本地后新。malloc之前的新。

局部变量在超出范围时会自毁。例如,不能从函数中返回一个,因为函数结束时它们会被销毁。但你永远不必担心清理工作。你确切地知道它是什么时候创建的,什么时候会被摧毁。

要使用局部变量,您需要知道它有多大以及它将存在多久。当您不知道其中一个或两者时,请转到层次结构中的下一个:new

new比本地分配带来更大的风险。任何new ed在不再需要时都必须与delete一起发布。这是程序员手中的额外书籍,可能已经被遗忘,或者没有涵盖在所有可能的代码流中。这被称为内存泄漏。new还提供大小正好合适的内存分配,并调用复杂对象的构造函数,确保它们被正确初始化。

malloc的泄漏风险与new大致相同,但malloc要求程序员指定正确的尺寸,这就有可能出现打字错误和其他人为错误。它不能用于装箱复杂的数据类型。它提供原始内存,但不调用任何构造逻辑。这是对位法,free只会让人回想起。没有调用析构函数。

对于歌曲标题,可以使用malloc,因为char是一个简单的数据类型,但需要额外的数学运算来调整大小并强制转换数据类型。额外风险。new消除了铸造和尺寸错误的可能性,但仍需要手动内存管理。数组的大小是已知的,因此满足了使用局部变量的第一个要求。变量的寿命未知。

如果setTitlesongtitle分配给成员变量,则寿命将延长,

char* songTitle = new char[50];

可能是最好的选择。如果setTilesongtitle复制到成员变量中,则寿命是已知的并且很短。在这种情况下,使用一个局部变量:

char songTitle[50];