Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 03.07.2020
Сообщений: 21
1

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

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

Author24 — интернет-сервис помощи студентам
Есть структура:
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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2020, 21:44
Ответы с готовыми решениями:

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

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

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

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

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

Цитата Сообщение от derr0x Посмотреть сообщение
пяти или семи?
Пять.
0
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
11.07.2020, 12:20 23
у вас только умолчательный конструктор !

при повторном
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  [ТС] 24
SmallEvil, тогда можно как то выделить память для экземпляра структуры, не потеряв размер и данные?
0
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
11.07.2020, 13:26 25
Цитата Сообщение от 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
11.07.2020, 13:26
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.07.2020, 13:26
Помогаю со студенческими работами здесь

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

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

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

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

Ошибка при выделении памяти под двумерный массив
#include &lt;iostream&gt; using namespace std; class array { int size1, size2; char **matr;...

Ошибка при выделении памяти под вектор методом resize
Всем добрый день! Возник следующий вопрос: выделяю память для вектора с помощью метода resize(w*h)....


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

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru