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)
这可以编译,但几乎立即崩溃。
它似乎导致内存泄漏
如果您使用 手动分配内存new,则必须使用 取消分配它delete。如果您忘记删除分配的内存,它确实总是会泄漏。
更好的方法是使用智能指针来处理释放:
std::unique_ptr<std::array<double,10000000>> pointer(new std::array<double,10000000>);
Run Code Online (Sandbox Code Playgroud)
附言。很高兴您认识到std::vector这样做更合适。我强烈建议你向你的导师询问,澄清你应该从这个练习中学到什么知识。
| 归档时间: |
|
| 查看次数: |
5830 次 |
| 最近记录: |