从malloc过渡到New
Transition from malloc to New
我一直在和一位导师一起做我的一项作业,他们在作业中使用了我的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
消除了铸造和尺寸错误的可能性,但仍需要手动内存管理。数组的大小是已知的,因此满足了使用局部变量的第一个要求。变量的寿命未知。
如果setTitle
将songtitle
分配给成员变量,则寿命将延长,
char* songTitle = new char[50];
可能是最好的选择。如果setTile
将songtitle
复制到成员变量中,则寿命是已知的并且很短。在这种情况下,使用一个局部变量:
char songTitle[50];
- 双吨级 - 从单级过渡到双倍级
- (C++)如何在不导致 mem 泄漏的情况下将指针传递到分配了'new'的函数?
- 从 calloc() 迁移到 new
- MySQL 从注入过渡到参数化时遇到麻烦
- 试图过渡到GTK3(针对GTK -3.0库编译)时,在此范围内未声明GTK_Object
- 如何安全地将 new 创建的对象传递到构造函数中
- 从正交投影平滑过渡到透视投影
- 使用pipe()和fork()从文件中读取并输出到console/new文件
- 为什么 ::运算符关键字添加到 new 之前用于内存分配
- 平滑过渡到标准三维视图方向
- 如何从getString rapidjson过渡到std::string
- 将带有 new 的字符 * 插入到矢量C++中
- 调用"new"以存储到shared_ptr的引用向量中
- 将结果写入文件时无法过渡到新行
- 从malloc过渡到New
- 在标准中哪里说' new '返回的每个分配都对齐到' std::max_align_t '
- 从(bad) array[size]移动到array = new float[size]
- "return new node"内存泄漏,我找不到修复它的方法
- 使用new操作符在不知道对象类型的情况下将其复制到堆中
- 使用Boost状态图,我如何无条件地过渡到一个状态