在访谈中,用C++编写两个函数来分配和取消分配int数组

Write two functions to allocate and deallocate int array in C++ in the interview

本文关键字:分配 函数 两个 数组 int 取消 访谈 C++      更新时间:2023-10-16

我被要求编写两个函数来在C++中分配和取消分配int数组。

int* allocate(int size){
return new int[size];
}
void deallocate(int *pt){
delete pt;
pt = NULL;
}

我想出了两个如上所述的函数。

有人知道在C++中有更好的方法将函数写入allocate/deallocateint数组吗?

我怀疑是否有更好的方法

这不是关于更好的方式与否,而是关于的正确性

使用

delete [] pt;

因为pt是一个数组


此外,正如thorsan所建议的,您可以将pt设置为NULL,但在deallocate()之外看不到,请参阅:

#include <iostream>
using namespace std;
int* allocate(int size) {
return new int[size];
}
void deallocate(int *pt) {
delete [] pt;
pt = NULL;
}
int main() {
int* pt = allocate(5);
deallocate(pt);
cout << (pt == NULL ? "NULL" : "not NULL") << endl;
return 0;
}

输出:

gsamaras@pythagoras:~$ g++ -Wall main.cpp 
gsamaras@pythagoras:~$ ./a.out 
not NULL

为了避免这种情况,只需传递一个引用,如下所示:

void good_deallocate(int*& pt) {
delete [] pt;
pt = NULL;
}

您还可以在第一个函数中检查分配是否成功,如下所示:

int* good_allocate(int size) {
try {
return new int[size];
}
catch(std::bad_alloc&) {
cerr << "shitn";
return NULL;
}
// OR as Dietmar Kühl suggested
/*
if (int* rc = new(std::nothrow) int[size]) {
return rc; 
} else {
// handle error
}
*/
}

灵感来自如何使用新运算符检查内存分配失败?

if (int* rc = new(std::nothrow) int[size]) {
return rc; 
} else {
cout << "New failed, unable to allocate" << object_name << 
", size needed:" << sizeof( int ) * size << "." << endl;
exit..., return... whatever, just don't use rc.
}

很多评论(在这里和其他地方)都是关于"为什么要处理?"你的程序无法工作,新的/分配错误不会在今天的大型(虚拟)机上发生,等等。想想一个程序是如何出现未检测到的"新"错误(或任何错误)的。对于"new",稍后通常会看到访问冲突。它可能与原始失败语句/变量关联,也可能不与之关联。

现在,假设你是一个运行这个程序的用户(可能你没有写)。我通常看到:"访问违规…核心转储"(或类似的)?我想看到:"新建失败,无法分配‘绒毛’,大小=24GB。程序终止。">

在第一个示例中,用户调用开发人员(在凌晨2点,因为在最糟糕的时候,这些错误总是非常严重的),随后进行了大量的调试工作。解决时间:小时?天?在第二种情况下,用户会说"24GB?怎么了?检查输入-哦,天哪,打字错误,我本想说24KB。让我来解决这个问题。"解决时间:分钟。没有电话,就没有挫败感。

良好的诊断,用户可以理解防止[紧急]电话呼叫!例如,请注意,即使我正在分配'int’s,我也包含了逻辑对象名,这对用户来说很有意义,并将帮助他解决问题。(Ummm,在需要的情况下,以任何适当的水平发出诊断,只需产生它并使其有用;这是值得付出的努力。)