#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. Эта ссылка не работает. Вероятно, в любом случае было бы лучше, если бы вы изменили свой вопрос с помощью любой имеющейся у вас соответствующей информации.