2013-05-05 1 views
-4

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

#include "stdafx.h" 
#include "iostream" 

using namespace std; 
int ASCENDING = 1, DESCENDING = 2; 

int tworzTablice(int rozmiar, char* t){ 
    try{ 
     t = new char[rozmiar]; 
     delete []t; 
    }catch (std::bad_alloc& e){ 
     tworzTablice(rozmiar - 1,t); 
     return -1; 
    } 
    return rozmiar; 
} 

int f(long p, long skok){ 
    char* t; 
    try{ 
     while(true){ 
      t = new char[p]; 
      delete []t; 
      p = p + skok; 
     } 
    } 
    catch (std::bad_alloc& ba){ 
    p = tworzTablice(p-1, t); 
    cout<<"blad"; 
    } 
    return p; 
} 

int main(){ 
    cout<<f(0, 100000000)<<endl;; 


    cout<<"koniec"<<endl; 
    system("pause"); 
    return 0; 
} 
+0

Почему вы хотите это знать? –

+0

Это зависит от размера вашей оперативной памяти, я считаю. И вы должны использовать delete [] t; вместо удаления t; Вот. – FreeNickname

+4

Двойной размер буфера, пока не произойдет сбой выделения ('t == NULL'), а затем двоичный поиск максимального разрешенного размера. – harpun

ответ

-1

Выделяя всю доступную память, вероятно, плохо идея, но если вы действительно хотите:

vector<char*> ptrs; 
int avail; 
try { 
    while (true) 
     ptrs.push_back(new char[1000]); 
} 
catch (bad_alloc& b) 
{ 
    avail = ptrs.size() * 1000; 
    for (int i = 0; i < ptrs.size(); i++) 
     delete[] ptrs[i]; 
} 
+1

-1: Все потребности OP - это 'std :: string'. Действительно плохой совет с 'std :: vector ' –

+1

@AlokSave Я предполагаю, что вы имеете в виду создание строки и ее рост до тех пор, пока она не выберет исключение? AFAIK, строки должны быть выделены смежно в памяти, так что метод будет показывать меньше доступной памяти, чем на самом деле – nullptr

+0

Да, непрерывная структура данных покажет вам, сколько памяти может быть выделено смежно, а не сколько памяти доступно в общей сложности , Этот ответ по-прежнему не учитывает, что некоторые ОС не фиксируют память до тех пор, пока вы не попытаетесь ее использовать, так что это может привести к ложным результатам. – jalf

1

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

Однако вы можете легко найти себя. Однако вы должны использовать malloc/free вместо new/delete во избежание ненужной инициализации всех ячеек;

#include <cstdlib> 
#include <cstdio> 

size_t maxMem() { 
    static size_t size = 0; 
    if (!size) { 
    size_t m = 0; 
    for (void* p = 0; (p = malloc(1<<m)); m++) 
     free(p); 
    while (m) { 
     size_t const testSize = size + (1<<(--m)); 
     if (void* const p = malloc(testSize)) { 
     size = testSize; 
     free(p); 
     } 
    } 
    } 
    return size; 
} 

int main() { 
    // forgive me for using printf, but I couldn't remember how to hex-format in std::cout 
    printf("%u (hex %X)\n",int(maxMem()),int(maxMem())); 
} 

На моей 64 битной машине я получаю

2147483647 (hex 7FFFFFFF) 

, а на другой 32 системы я получаю

2140700660 (hex 7F987FF4) 

Вы можете идти вперед и new массив из этого размера, если вы действительно должен. Обратите внимание, что это самый большой последовательный номер, который вы можете запросить. Общая память, которую может выделить ваш процесс, больше и зависит от установленной ОЗУ и зарезервированного пространства подкачки.

Смежные вопросы