Как объявить класс с 1000000 элементов C ++

0

Я пишу код c++, и мне нужно объявить класс, имеющий два эльюса, как

class arr{
    public:
        long num;
        string str;
};

теперь мне нужно сохранить почти 1000000 эльмов этого класса (в зависимости от количества вводимых пользователем объектов класса может использоваться в пределах 1 <= n <= 1000000 Объект создается динамически как

#include <iostream>
#include<string>

using namespace std;

class arr{
    public:
        long i;
        string str;
};

int main(){
    long n,j,i;
    cin>>n;
    arr a[n];

.... остальная часть программы

но если значение n велико, то 100000, тогда программы зависают, но отлично работают для значения менее 100000, какой подход должен я попытаться объявить более чем 100000 объектов в попытке решить проблему с помощью 2D-массива, который делят arra на две части

arr [1000] [1000];

но этот подход не работает для меня

пожалуйста, если у кого-нибудь есть идея, помогите мне с этой благодарностью заранее

Теги:
class
object
arrays
declaration

3 ответа

4
Лучший ответ

Просто используйте std::vector

#include <iostream>
#include <vector>

int main(){
    long n;
    cin>>n;
    std::vector<arr> a(n);
}
  • 0
    большое спасибо это решило мою проблему большое спасибо :). кажется, что я просто встречаюсь со старым понятием. !!
1

Вот некоторая справочная информация о том, почему выделение слишком больших объектов в стеке терпит неудачу с ошибкой сегментации, в то время как в стеке может быть выделено столько же места, сколько во многих маленьких кусках:

Механик состоит в том, что система устанавливает стек с небольшим объемом выделенной памяти. Это распределение защищено недоступной областью памяти. Всякий раз, когда программа обращается к этой недоступной области, аппаратное обеспечение сигнализирует ядро; ядро анализирует ситуацию, выводит, что программе требуется больше памяти стека, растет стек на нескольких страницах памяти и сообщает аппарату нормально продолжать выполнение программы.

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

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

1

what approach should я try to declare more than 100000 objects?

заключается в том, чтобы объявить их в heap не в stack, вы объявляете объект 1000000 в стеке, что очень много. Будьте осторожны, существует ограничение на стек:

C/C++ максимальный размер стека программы

почему размер памяти стека настолько ограничен?

чтобы объявить их в кучу, используйте:

arr *arr= new arr[n];

что тот же механизм, который vector использует для инициализации элементов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню