面试中用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”,但我包含了 逻辑对象名称 ,这对用户来说很有希望,并且会帮助他解决问题。 (嗯,以防万一,在任何适当的级别发出诊断,只是产生它并使其有用;这是值得的努力。)