Je suis conscient que je suis supposé utiliser std :: vector si je veux générer un grand tableau sur le tas.Comment générer et utiliser un C++ 11 std :: array avec new pour utiliser le tas au lieu de la pile?
Cependant, dans mon cours, je dois utiliser std :: array à la place. Comme de très grands tableaux sont requis pour la tâche, je voulais forcer le compilateur à créer le tableau sur le tas au lieu de la pile.
La seule façon que j'ai obtenu mon compilateur accepte c'était:
std::array<double,10000000>* array = new array<double,10000000>;
Cependant, le programme se bloque une fois que j'essaie de l'utiliser, car il semble causer des fuites de mémoire. Y a-t-il un moyen de contourner ce problème?
modifier:
Voici une partie des choses que j'essaie de faire: je dois générer un grand tableau, puis générer des nombres aléatoires et trouver le minimum. Je pense que le reste devrait fonctionner avec la même mécanique:
à Main:
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);
La première fonction du modèle:
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);
}
}
La deuxième fonction du modèle:
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;
}
Cela compile mais se bloque presque immédiatement.
Vous aurez besoin de poster le code que vous avez utilisé pour y accéder. (Heureusement pas 'array [3] = 1.0;') –
La perte de mémoire n'entraîne pas de blocage. S'il vous plaît fournir des détails sur l'accident. Veuillez lire [Comment créer un exemple minimal, complet et vérifiable] (http://stackoverflow.com/help/mcve) et [Comment poser une bonne question?] (Http://stackoverflow.com/help/ comment demander). Ensuite, mettez à jour et améliorez * votre question *. –
@MartinNyolt votre point est excellent, même si techniquement, une fuite de mémoire peut entraîner l'épuisement de la mémoire, ce qui peut provoquer le blocage du programme sur les systèmes utilisant une allocation de mémoire optimiste. – user2079303