繁体   English   中英

在面试中编写两个函数来分配和释放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 ++中分配/解除分配 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM