2015-06-01 5 views
0

Моя цель - найти максимальное значение (минимум p последовательного числа) * p. Здесь 1 < = p < = N и 1 < = N < = 100000 и 1 < = номер < = 1000000. Я частично решил проблему. Но в некоторых случаях я получаю эту ошибку времени выполнения.Как я могу избавиться от ошибки сегментации?

"прекратить окликнул бросать экземпляр„станд :: bad_alloc“ , что(). Станд :: bad_alloc Это приложение просил Runtime прекратить его необычным способом Пожалуйста, свяжитесь со службой поддержки приложения для больше информации."

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

#include <iostream> 

using namespace std; 

int main(){ 
int N=0; 
cin>>N; 
int **A,*B,i,j,num; 
A = new int*[N]; 
for(i=0;i<N;i++) 
    A[i] = new int[N](); 
B = new int[N](); 

for(i=0;i<N;i++){ 
    cin>>num; 
    A[0][B[0]] = num; 
    for(j=0;j<B[0];j++){ 
     A[j+1][B[j+1]] = min(A[j][B[j+1]],A[j][B[j+1]+1]); 
     B[j+1]++; 
    } 
    B[0]++; 
} 
long long maxim = 0; 
for(i=0;i<N;i++){ 
    for(j=0;j<B[i];j++){ 
     if(A[i][j]*(i+1) > maxim) 
     maxim = A[i][j]*(i+1); 
    } 
} 

cout<<maxim; 
delete []A; 
delete []B; 
return 0; 
} 
+1

Может быть, это не место для N * N целых чисел? В конце концов, 100000 * 100000 * 4 = составляет 38000 МБ, поэтому по крайней мере моя машина с 16 ГБ ОЗУ не справится с этим. –

+1

Обратите внимание, что «bad_alloc» не «использует память, которая не выделена», это «недостаточно памяти». –

+0

Должно быть в порядке с 64-битным приложением и ОС, –

ответ

0

Часть того, кто становится инженером-программистом, учится разбивать проблемы на более мелкие куски. Чтобы решить эту проблему, вы должны начать с разбивки проблемы до самой маленькой единицы.

int main() 
{ 
    size_t dimension = 100000; 
    int** outer = new int[dimension]; 
    for (size_t i = 0; i < dimension; ++i) { 
     outer[i] = new int[dimension]; 
    } 
} 

Скомпилируйте и загрузите в отладчик, перейдите и найдите, где произошло исключение. Или вы могли бы написать таким образом:

#include <iostream> 

int main() 
{ 
    size_t dimension = 100000; 
    size_t allocated = 0; 
    int** outer = new int*[dimension]; 
    allocated += sizeof(int*) * dimension; 
    for (size_t i = 0; i < dimension; ++i) { 
     try { 
      outer[i] = new int[dimension]; 
      allocated += sizeof(int) * dimension; 
     } catch (std::bad_alloc&) { 
      std::cerr << "bad alloc at iteration " << i << " with " << allocated << " bytes allocated\n"; 
      return -1; 
     } 
    } 
} 

Или

#include <iostream> 

int main() 
{ 
    size_t dimension = 100000; 
    std::cout << "Allocating outer: " << (dimension * sizeof(int*)) << " bytes\n"; 
    int** outer = new int[dimension]; 
    for (size_t i = 0; i < dimension; ++i) { 
     std::cout << "Allocating outer[" << i << "] (" << (dimension * sizeof(int)) << " bytes\n"; 
     outer[i] = new int[dimension]; 
    } 
} 
8

станд :: bad_alloc выбрасывается при failing to allocate memory.

Вы пытаетесь выделить пространство для 100000 * 100000 целых чисел. Это ~ 40 ГБ оперативной памяти, чего у вас, вероятно, нет.

+0

вы можете помочь мне, как я могу решить указанную проблему с меньшим использованием ram.Any алгоритма ... – cryptomanic

+0

- реализация стека может помочь мне .if yes.then как. – cryptomanic