如何生成和使用带有 new 的 c++11 std::array 以使用堆而不是堆栈?

use*_*675 4 c++ arrays vector std c++11

我知道如果我想在堆上生成一个大数组,我应该使用 std::vector 。

然而在我的演讲中我必须使用 std::array 来代替。由于该任务需要非常大的数组,因此我想强制编译器在堆而不是堆栈上创建数组。

我让编译器接受这一点的唯一方法是:

std::array<double,10000000>* array = new array<double,10000000>;
Run Code Online (Sandbox Code Playgroud)

然而,一旦我尝试使用它,程序就会崩溃,因为它似乎会导致内存泄漏。有没有办法正确解决这个问题?

编辑:

这是我尝试做的事情的一部分:我需要生成一个大数组,然后生成随机数并找到最小值。我认为其余部分应该使用相同的机制:

主要内容:

std::array<double,10000000>* array = new array<double,10000000>;

genrate_array(*array);
std::cout<<"Minimum one loop:" << std::endl;
std::cout<<" " << std::endl;
time_measure<start_size, double>(plain_minimum, *array);
Run Code Online (Sandbox Code Playgroud)

第一个模板函数:

template<std::size_t N, typename T>
void genrate_array(std::array<T, N>& test_arr){
    //generate the array
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution<T> dist_int( 0.0,500.0);

    for(std::size_t i = 0; i< test_arr.size() ; i++)
    {
        test_arr[i] = dist_int(mt);
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个模板函数:

template<std::size_t N, typename T>
T plain_minimum(std::array<T,N>& arr, std::size_t start_index,std::size_t end_index)
{
    T min = arr[start_index];

    for(std::size_t i = start_index+1; i< end_index ; i++){
        if(min > arr[i])
        {
            min = arr[i];
        }
    }
    return min;
}
Run Code Online (Sandbox Code Playgroud)

这可以编译,但几乎立即崩溃。

eer*_*ika 5

它似乎导致内存泄漏

如果您使用 手动分配内存new,则必须使用 取消分配它delete。如果您忘记删除分配的内存,它确实总是会泄漏。

更好的方法是使用智能指针来处理释放:

std::unique_ptr<std::array<double,10000000>> pointer(new std::array<double,10000000>);
Run Code Online (Sandbox Code Playgroud)

附言。很高兴您认识到std::vector这样做更合适。我强烈建议你向你的导师询问,澄清你应该从这个练习中学到什么知识。

  • @user1997675 您不能通过写入双精度数组来泄漏内存。您认为为什么这会导致内存泄漏?假设函数通过引用获取数组,则传递数组的方式似乎是正确的。如果您按值传递这个大对象,那么您可能会耗尽堆栈空间。 (2认同)