Как выделить память для переменной структуры, члены которой имеют тип string

#c #memory-management

Вопрос:

Моя структура:

 struct Company {
    string name;
    string profit_tax;
    string address;
};
 

Я выделил с помощью строки:

 Company* a = (Company*)calloc(m, sizeof(Company));
 

с long long m =pow(10,9) 9
но указатель a является нулевым указателем после выделения. Я не знаю, почему это произошло?. Пожалуйста, скажите мне решение, спасибо!

Комментарии:

1. В 99% случаев решение было бы auto a = new Company[m];

2. @StefanRiedel Я не согласен. Гораздо лучше было бы std::vector<Company> a(m); .

3. Размер std::string составляет что-то вроде 24 или 32 байт на 64-разрядной архитектуре. Знаете ли вы, что выделяете 72 или 96 ГБ? Сколько у вас оперативной памяти?

4. Кстати, вы действительно хотите просто выделить память (хранилище), или вы также хотите, чтобы объекты в этом хранилище были созданы?

5. @DanielLangr, я знаю это, у моего ноутбука 8 ГБ оперативной памяти. Но это задача моего упражнения. Я думаю, что это неправильно

Ответ №1:

Вы выделяете слишком много памяти для своего компьютера (если только у вас нет огромного объема памяти).

Посмотрите <a rel=»noreferrer noopener nofollow» href=»https://gcc.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(fontScale:14,fontUsePx:’0′,j:1,lang:c++,selection:(endColumn:1,endLineNumber:10,positionColumn:1,positionLineNumber:10,selectionStartColumn:1,selectionStartLineNumber:10,startColumn:1,startLineNumber:10),source:’#include
#include
#include

struct Company {
std::string name;
std::string profit_tax;
std::string address;
};

int main() {

auto company_size = sizeof(Company);
auto target_size = std::pow(10, 9) + 9;

std::cout << «struct Company size : » << company_size << » bytesn»;
std::cout << «Num elements : » << target_size << !’n!’;
std::cout << «Total bytes needed : » << (company_size * target_size) / 1e9 <этот пример godbolt, расчеты показывают, что на их оборудовании вы попытаетесь выделить 96 ГБ памяти!

Если это упражнение, может быть, у вас где-то есть опечатка в размере, который вы должны выделить? Если нет, вы можете попытаться заменить std::string индексы/указатели на то, где хранятся строки. Это должно сэкономить немного памяти, но у вас все равно будут проблемы. В противном случае вам придется обрабатывать данные по-другому, обрабатывая их по частям.

Если вы используете C , почему вы используете calloc ? Вы могли бы просто иметь std::vector<company> companies(m); , и это выделит память И построит все ваши объекты. Менее подвержен ошибкам и более удобочитаем.

Комментарии:

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

2. Все потерпит неудачу, если вы не сможете выделить требуемую память.

3. ссылка на мое упражнение [ссылка] drive.google.com/drive/recent

4. Эта ссылка не работает. Вероятно, в любом случае было бы лучше, если бы вы изменили свой вопрос с помощью любой имеющейся у вас соответствующей информации.