[英]Write two functions to allocate and deallocate int array in C++ in the interview
我被要求编写两个函数来在C ++中分配和释放int数组。
int* allocate(int size){
return new int[size];
}
void deallocate(int *pt){
delete pt;
pt = NULL;
}
我想出了上面的两个功能。
有谁知道有更好的方法来编写在C ++中分配/解除分配 int数组的函数?
我怀疑有更好的方法
这不是关于更好的方式,而是关于正确性 。
采用
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 << "shit\n";
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.
}
很多评论(这里和其他地方)都是关于“为什么要费心去处理?” 你的程序无法工作,新的/ alloc错误不会发生在今天的大型(虚拟)机器上等等。想想一个程序如何检测到未检测到的“新”错误(或任何错误)。 对于“新”,稍后,您通常会看到访问冲突。 它可能会或可能不会与原始的失败声明/变量相关联。
现在,假装你是运行这个程序的用户(可能你没写过)。 我经常看到:“访问违规......核心转储”(或类似)? 我想看看:“新的失败,无法分配'绒毛',大小= 24GB。程序终止。”
在第一个示例中,用户调用开发人员(凌晨2点,因为这些在最糟糕的时间始终是关键错误),并且随后会进行大量的调试工作。 是时候解决了:几小时? 天? 在第二种情况下,用户说“24GB?哎呀?检查输入 - 哦,哎呀,错字,我的意思是24KB。让我解决这个问题。” 解决的时间:分钟。 没有电话,没有挫败感。
用户可以理解的 良好诊断可以防止[紧急]电话呼叫! 请注意,例如,即使我正在分配'int',我也包含逻辑对象名称 ,这有望对用户有所帮助,并有助于他解决问题。 (嗯,如果需要说的话,在适当的任何级别发出诊断,只需生产并使其有用;值得努力。)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.