面试中用C++写了两个分配和释放int数组的函数
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++ 中将函数写入 allocate/deallocate int 数组有更好的方法吗?
I doubt there is a better way
这不是关于更好的方法,而是关于正确性。
使用
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
}
*/
}
灵感来自 How to check memory allocation failures with new operator?
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.
}
许多评论(此处和其他地方)是关于 "why bother to handle?" 您的程序无法运行,new/alloc 错误不会发生在当今的大型(虚拟)机器上,等等。
想一想具有未检测到的 'new' 错误(或任何错误,就此而言)的程序是如何失败的。对于 'new',稍后您通常会看到访问冲突。它可能与最初失败的 statement/variable(s).
相关联,也可能不相关联。
现在,假装你是这个程序的用户运行(你可能没有写)。我通常会看到:"Access violation... core dumped"(或类似的)?
我想看:"New failed, unable to allocate 'fluff', size = 24GB. Program terminated."
在第一个示例中,用户致电开发人员(凌晨 2 点,因为这些总是在最坏的可能时间发生的严重错误),随后进行了重大的调试工作。解决时间:几小时?天?
在第二种情况下,用户说“24GB?到底是什么?检查输入 - 哦,糟糕,打字错误,我的意思是 24KB。让我来解决这个问题。”解决时间:分钟。没有电话,没有沮丧。
良好 诊断,用户可以理解 防止[紧急] phone 呼叫!请注意,例如,尽管我正在分配“int”,但我包含了 逻辑对象名称 ,这对用户来说很有希望,并且会帮助他解决问题。 (嗯,以防万一,在任何适当的级别发出诊断,只是产生它并使其有用;这是值得的努力。)
我被要求编写两个函数来在 C++ 中分配和释放 int 数组。
int* allocate(int size){
return new int[size];
}
void deallocate(int *pt){
delete pt;
pt = NULL;
}
我想到了上面两个函数
有谁知道在 C++ 中将函数写入 allocate/deallocate int 数组有更好的方法吗?
I doubt there is a better way
这不是关于更好的方法,而是关于正确性。
使用
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
}
*/
}
灵感来自 How to check memory allocation failures with new operator?
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.
}
许多评论(此处和其他地方)是关于 "why bother to handle?" 您的程序无法运行,new/alloc 错误不会发生在当今的大型(虚拟)机器上,等等。 想一想具有未检测到的 'new' 错误(或任何错误,就此而言)的程序是如何失败的。对于 'new',稍后您通常会看到访问冲突。它可能与最初失败的 statement/variable(s).
相关联,也可能不相关联。现在,假装你是这个程序的用户运行(你可能没有写)。我通常会看到:"Access violation... core dumped"(或类似的)? 我想看:"New failed, unable to allocate 'fluff', size = 24GB. Program terminated."
在第一个示例中,用户致电开发人员(凌晨 2 点,因为这些总是在最坏的可能时间发生的严重错误),随后进行了重大的调试工作。解决时间:几小时?天? 在第二种情况下,用户说“24GB?到底是什么?检查输入 - 哦,糟糕,打字错误,我的意思是 24KB。让我来解决这个问题。”解决时间:分钟。没有电话,没有沮丧。
良好 诊断,用户可以理解 防止[紧急] phone 呼叫!请注意,例如,尽管我正在分配“int”,但我包含了 逻辑对象名称 ,这对用户来说很有希望,并且会帮助他解决问题。 (嗯,以防万一,在任何适当的级别发出诊断,只是产生它并使其有用;这是值得的努力。)