2016-11-07 8 views
0

Я знаю, что я должен использовать std :: vector, если я хочу создать большой массив в куче.Как сгенерировать и использовать C++ 11 std :: array с новым, чтобы использовать кучу вместо стека?

Однако в моей лекции я должен использовать std :: array. Поскольку для задачи я требую очень больших массивов, я хотел заставить компилятор создать массив в куче вместо стека.

Единственный способ, которым я получил мой компилятор принимает это:

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

Однако программа вылетает, когда я пытаюсь использовать его, так как он, кажется, вызывает утечку памяти. Есть ли все равно, чтобы обойти это правильно?

редактировать:

Вот часть материала я пытаюсь сделать: Мне нужно создать большой массив, а затем генерировать случайные числа и найти минимум. Я думаю, что остальное должно работать с той же механикой:

В 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); 

Первая функция шаблона:

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; 
} 

Это компилируется, но падает почти мгновенно.

+0

Вам нужно будет выслать код, который вы использовали для его доступа. (Надеюсь, не 'array [3] = 1.0;') –

+2

Утечка памяти не вызывает сбоя. Пожалуйста, предоставьте подробную информацию об аварии. Пожалуйста, прочитайте [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и [Как задать хороший вопрос?] (Http://stackoverflow.com/help/ как к спрашивать). Затем обновите и улучшите * свой вопрос *. –

+0

@MartinNyolt ваша точка отлично, хотя технически утечка памяти может привести к выходу из памяти, что может привести к сбою программы в системах, использующих оптимистичное распределение памяти. – user2079303

ответ

3

, кажется, вызывает утечек памяти

Если вручную выделить память с new, то вы должны освободить его delete. Если вы забудете удалить выделенную память, она всегда будет протекать.

Лучший подход заключается в использовании смарт-указатель, который будет заботиться о открепления:

std::unique_ptr<std::array<double,10000000>> pointer(new std::array<double,10000000>); 

PS. Хорошо, что вы признаете, что std::vector будет более подходящим для этого. Я настоятельно призываю вас попросить вашего инструктора прояснить, каковы знания, которые вы должны извлечь из этого упражнения.

+0

Привет, спасибо за ответ. Хорошо, я понимаю, что мне нужно удалить его вручную. Но утечки, похоже, происходят, когда я пытаюсь написать массив. Поэтому я, вероятно, перехожу неправильно к функции шаблона, которая записывает в нее случайные двойные значения. Я попытался передать его следующим образом: generat (* array) – user1997675

+2

@ user1997675 вы не можете просачивать память, записывая массив в парные разряды. Почему вы думаете, что это приводит к утечке памяти? Способ передачи массива кажется правильным, предполагая, что функция принимает массив по ссылке. Если вы передадите этот большой объект по значению, вы, вероятно, закончите пространство стека. – user2079303

+0

Я пытаюсь передать его по ссылке, но, похоже, не работает. Я редактировал свой вопрос с кодом, который использовал, когда я разместил этот вопрос. Я не совсем уверен, где именно я ошибаюсь. Так что это положить на стек, если я попробую передать его по ссылке или я не могу передать правильную вещь? – user1997675