在访谈中,用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/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,在需要的情况下,以任何适当的水平发出诊断,只需产生它并使其有用;这是值得付出的努力。)
- 无法分配函数指针的 2D 数组
- Clang-Format 不能正确分配函数参数
- 我们可以在cpp中为对象分配函数吗
- 分段错误分配函数结果
- 在类内分配函数指针
- 创建一个移动分配函数,不断得到"pointer being freed was not allocated"
- 如何在C++中重新分配函数名称
- 尝试分配函数指针时获取"Void value not ignored as it ought to be"
- 尝试从文件中获取数据时,在C 中的分配函数中没有正确的字符串
- 当使用内存分配函数用作条件语句时会发生什么
- 解除分配函数的 A 函数 B 内的运行时内存
- 是否可以编写一个自定义 STL 分配器,该分配器使用指向用户提供的分配函数的指针
- 当分配函数指针时,这两种符号之间有什么区别
- 新的运算符分配函数顺序连续性和初始值
- 在类中分配函数指针会在C++中给出值类型错误
- 函数包装中的堆栈分配/函数中的alloca
- 创建线程,在循环中为其分配函数并执行
- 我想我可以理解 N5.3.4 中的 §4140/11,但已扩展的分配函数的概念对我来说是不可理解的
- 析构函数和解分配函数的区别是什么?
- 为什么分配函数使用std::nothrow_t作为引用而不是值