如何生成和使用带有 new 的 c++11 std::array 来使用堆而不是堆栈?
How to generate and use a c++11 std::array with new to use the heap instead of the stack?
我知道如果我想在堆上生成一个大数组,我应该使用 std::vector。
但是在我的演讲中我必须使用 std::array 来代替。由于任务需要非常大的数组,我想强制编译器在堆而不是堆栈上创建数组。
我让我的编译器接受它的唯一方法是:
std::array<double,10000000>* array = new array<double,10000000>;
然而,一旦我尝试使用它,程序就会崩溃,因为它似乎会导致内存泄漏。
有没有办法正确解决这个问题?
编辑:
以下是我尝试做的部分工作:
我需要生成一个大数组,然后生成随机数并找到最小值。我认为它的其余部分应该使用相同的机制:
主要内容:
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);
第一个模板函数:
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);
}
}
第二个模板函数:
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;
}
这可以编译但几乎立即崩溃。
it seems to causing memory leaks
如果您使用 new
手动分配内存,则必须使用 delete
释放它。如果你忘记删除你分配的内存,它确实会一直泄漏。
更好的方法是使用智能指针来处理重新分配:
std::unique_ptr<std::array<double,10000000>> pointer(new std::array<double,10000000>);
PS。很高兴您认识到 std::vector
更适合于此。我强烈建议您请教您的老师,以阐明您应该从该练习中学到哪些知识。
我知道如果我想在堆上生成一个大数组,我应该使用 std::vector。
但是在我的演讲中我必须使用 std::array 来代替。由于任务需要非常大的数组,我想强制编译器在堆而不是堆栈上创建数组。
我让我的编译器接受它的唯一方法是:
std::array<double,10000000>* array = new array<double,10000000>;
然而,一旦我尝试使用它,程序就会崩溃,因为它似乎会导致内存泄漏。 有没有办法正确解决这个问题?
编辑:
以下是我尝试做的部分工作: 我需要生成一个大数组,然后生成随机数并找到最小值。我认为它的其余部分应该使用相同的机制:
主要内容:
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);
第一个模板函数:
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);
}
}
第二个模板函数:
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;
}
这可以编译但几乎立即崩溃。
it seems to causing memory leaks
如果您使用 new
手动分配内存,则必须使用 delete
释放它。如果你忘记删除你分配的内存,它确实会一直泄漏。
更好的方法是使用智能指针来处理重新分配:
std::unique_ptr<std::array<double,10000000>> pointer(new std::array<double,10000000>);
PS。很高兴您认识到 std::vector
更适合于此。我强烈建议您请教您的老师,以阐明您应该从该练习中学到哪些知识。