【问题标题】:Does the the dynamic array need to be deleted or deallocated if the return is not assigned? Or is it deleted by the function?如果未分配返回值,是否需要删除或释放动态数组?还是被功能删除了?
【发布时间】:2015-05-10 20:50:46
【问题描述】:
#include <iostream>
using namespace std;

int *arrExpand(int *arr, int arrSize)
{
    int *p = new int [arrSize * 2];
    for(int i =0; i < arrSize * 2; i++)
    {   if(i < arrSize)
            p[i] = arr[i];
        if(i > arrSize)
            p[i] = 0;
    }
    return p;
}

int main()
{
    int mySize = 5;
    int myArr[5] = {1,2,3,4,5};

    cout << "Array: ";
    for(auto v: myArr)
        cout << v;
    for( int i = 0; i < mySize * 2; i++)
        cout  << endl << *(arrExpand(myArr,mySize)+i);
    //return is not assigned == delete not needed?
    return 0;
}

由于未分配返回值,该函数是否会删除并释放内存? 是否需要释放内存?

【问题讨论】:

标签: c++ arrays memory dynamic


【解决方案1】:

如前所述,您确实需要delete[] 内存。你只要记住这个简单的规则:

deletenewed 完全 一次。这同样适用于delete[]new[]

但我不同意智能指针的建议。虽然std::unique_ptr 作为大型旧代码库(如here 所述)中原始数组的直接替换具有一些优势,但更自然的替代方案是std::vector

std::vector<int> arrExpand(int *arr, int arrSize)
{
    std::vector<int> p (arrSize * 2);
    for(int i =0; i < arrSize * 2; i++)
    {   if(i < arrSize)
            p[i] = arr[i];
        if(i > arrSize)
            p[i] = 0;
    }
    return p;
}

甚至更好

std::vector<int> arrExpand(const std::vector<int> &arr)
{
    std::vector<int> p (arr.size() * 2);
    for(int i =0; i < arr.size() * 2; i++)
    {   if(i < arr.size())
            p[i] = arr[i];
        if(i > arr.size())
            p[i] = 0;
    }
    return p;
}

通常(至少我不知道反例)使用std::vector 作为标准运行时大小的数组是一个非常好的主意。一个很好的理由是自动和正确的内存管理。它还带有很多有用的成员函数,包括知道自己的大小。

【讨论】:

    【解决方案2】:

    简短回答:是的,需要删除。

    如果你用new 分配对象,你也应该删除它们。使用普通指针容易出错并且需要大量手动工作,这就是 C++ 提供多个智能指针的原因,最重要的是 std::unique_ptrstd::shared_ptr。在您的情况下,std::unique_ptr 可能是一个选项。

    例子:

    std::unique_ptr<int[]> arrExpand(int *arr, int arrSize)
    {
        std::unique_ptr<int[]> p( new int [arrSize * 2] );
        for(int i =0; i < arrSize * 2; i++)
        {   if(i < arrSize)
                p[i] = arr[i];
            if(i > arrSize)
                p[i] = 0;
        }
        return std::move(p);
    }
    

    在您的示例中可以这样使用:

    auto result = arrExpand(myArr,mySize);
    for( int i = 0; i < mySize * 2; i++)
        cout  << endl << result[i];
    

    请注意,您应该将arrExpand 的结果存储一次在循环之前,否则将在循环的每次迭代中调用该函数,这是非常低效的。

    【讨论】:

    • 如果没有分配删除,我会将删除放在哪里?在返回 0 之前?
    • @tariqebadi 这就是使用智能指针的原因:你不必打电话给delete,他们会处理的。当你像我展示的那样使用std::unique_ptr 时,你基本上是安全的,不会有资源泄漏——即使是在异常的情况下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-10
    相关资源
    最近更新 更多