0 / 0 / 0
Регистрация: 03.07.2020
Сообщений: 21

Ошибка при выделении памяти структуры

10.07.2020, 21:44. Показов 2910. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть структура:
C++
1
2
3
4
5
6
7
8
9
10
11
12
struct SqliteMasterEntry
{
    SqliteMasterEntry()
        : ItemName()
        , RootNum()
        , SqlStatement()
    {}
 
    string ItemName;
    long RootNum;
    string SqlStatement;
};
Объявляю саму стуктуру:
C++
1
static SqliteMasterEntry* _masterTableEntries;
Теперь в коде пытаюсь выделить память
C++
1
_masterTableEntries = new SqliteMasterEntry[1];
Но возникает ошибика:Не разрешенный внешний символ
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.07.2020, 21:44
Ответы с готовыми решениями:

Ошибка при выделении памяти динамически для структуры
Есть программа. Вылетает ошибка. Если gets(BLOCKNOTE.NAME) заменить на cin>>BLOCKNOTE.NAME все работает нормально. Хотелось бы ипользовать...

Ошибка при выделении памяти
Когда убираю free(buf), то ошибки нету, а когда есть, то вылазит ошибка. Почему такое происходит? #include <stdlib.h> #include...

Ошибка при выделении памяти
Здравствуйте, друзья. Подскажите, пожалуйста, почему выскакивает ошибка при повторном выделении память (ведь память в куче удаляется...

24
0 / 0 / 0
Регистрация: 03.07.2020
Сообщений: 21
11.07.2020, 11:49  [ТС]
Студворк — интернет-сервис помощи студентам
SmallEvil, а вы случайно не знаете, если я выделю память:
C++
1
_masterTableEntries = new SqliteMasterEntry[2];
И если я буду где то там выделять память для _masterTableEntries, текущий размер будет 2, а вот если я опять выделю память:
C++
1
_masterTableEntries = new SqliteMasterEntry[5];
То размер _masterTableEntries будет скольки? пяти или семи?
0
19505 / 10108 / 2463
Регистрация: 30.01.2014
Сообщений: 17,828
11.07.2020, 11:57
Цитата Сообщение от derr0x Посмотреть сообщение
а вот если я опять выделю память
То первые два вы потеряете навсегда (в вашей программе). Будет утечка памяти.

Цитата Сообщение от derr0x Посмотреть сообщение
пяти или семи?
Пять.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.07.2020, 12:20
у вас только умолчательный конструктор !

при повторном
C++
1
_masterTableEntries = new SqliteMasterEntry[5];
получите новое количество из 5 SqliteMasterEntry и заодно потеряете выделенную ранее память
с таким подходом вы быстро запутаетесь и потеряете свои указатели


выделив память один раз в любом месте кода
C++
1
_masterTableEntries = new SqliteMasterEntry[5];
вы получаете глобальный укзатель.


Вы хоть немного разбираетесь в том что написалИ?.
Когда я смотрю на все эти static мне реально делается страшно вести этот код и советовать что то.
P.S. наверное сказывается мой небольшой опыт.

ну надеюсь со структурой хоть уже пашет ? )

Добавлено через 9 минут
в Стандартной Шаблонной Библиотеке (STL) с++ есть много годных контейнеров,
в которых можно хранить как обьекты так и указатели на них, добавлять и/или удалять их.
Делать это самому слишком рисковано и дороже (время, ошибки).
0
0 / 0 / 0
Регистрация: 03.07.2020
Сообщений: 21
11.07.2020, 12:21  [ТС]
SmallEvil, тогда можно как то выделить память для экземпляра структуры, не потеряв размер и данные?
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
11.07.2020, 13:26
Цитата Сообщение от derr0x Посмотреть сообщение
SmallEvil, тогда можно как то выделить память для экземпляра структуры, не потеряв размер и данные?
будем морочится с указателями - значит будем.
так как наш указатель изначально инициализированный пустым указателем ,
мы можем на него сравнивать при каждом вызове
C++
1
new SqliteMasterEntry
:
забежим вперед/назад , добавим оператор присваивания(копирования) в SqliteMasterEntry
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct SqliteMasterEntry
{
    string ItemName;
    long RootNum;
    string SqlStatement;
    SqliteMasterEntry() : ItemName(""), RootNum(0), SqlStatement("") {};
    SqliteMasterEntry(string &name, long rnum, string &state) : ItemName(name), RootNum(rnum), SqlStatement(state) {};
    SqliteMasterEntry& operator= (const SqliteMasterEntry &rhs)
    {
        if (this != &rhs) {
          this->ItemName = rhs.ItemName;
          this->RootNum = rhs.RootNum;
          this->SqlStatement = rhs.SqlStatement;
       }
     return *this;
    }
 
};
ok
так как это динамический массив то надо еще хранить его размер
возле
C++
1
 static SqliteMasterEntry * _masterTableEntries = nullptr;
C++
1
 static int _mtable_size = 0;
мы можем на него сравнивать при каждом вызове
C++
1
new SqliteMasterEntry
:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if (_masterTableEntries==nullptr) // если ссылка пустая смело вызываем new,
  {
     _masterTableEntries = new SqliteMasterEntry[5];
     _mtable_size            = 5;
  }
else // память уже была выделена
{
    SqliteMasterEntry tmp = new SqliteMasterEntry[_mtable_size + 3 ]; // добавляем еще три новых записи
    
  for(int i=0; i<_mtable_size; i++)
       tmp [i] = _masterTableEntries[i];
//   скопировали
    _mtable_size += 3;
   // заполнили новые значения если нужно (с индексами 5 6 7)
    delete [] _masterTableEntries; // высвободили память
  _masterTableEntries = tmp; // 
}
нраввится ??? ))

Добавлено через 2 минуты
на этом все с меня хватит.
удачного кодинга !

Добавлено через 1 минуту
и да, отучите себя именовать переменные начиная с "_", "__", "с". хотя бы
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.07.2020, 13:26

Ошибка при выделении памяти
Вопрос: из-за чего программа может рушится? int *NRRow = new int ; int *NRow = new int ; int *NCol = new int ; //тут...

Ошибка при динамическом выделении памяти
почему у меня возникет ошибка вот тут struct TOVAR *New = new struct TOVAR; пишит недопустимый неполный тип на struct подчеркивает...

Ошибка при динамическом выделении памяти
Я не понимаю почему, но почему-то пример по динамическому выделению памяти, взятый с этой веб-страницы: http://cppstudio.com/post/9555/...

Ошибка при выделении памяти с помощью malloc
Помогите выдает ошибку в рядочке :&quot;Ar = ( far *)malloc(size*sizeof(int));&quot; полный текст програмы: #include &quot;stdafx.h&quot; using...

Иерархия классов. Ошибка при выделении памяти
Добрый день. Пишу класс Транспортное средство. Столкнулся с несколькими ошибками. Программа запускается. Но при работе выдаётся ошибка...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Опции темы

Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru