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

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

10.07.2020, 21:44. Показов 2892. Ответов 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
19501 / 10106 / 2461
Регистрация: 30.01.2014
Сообщений: 17,825
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
Ответ Создать тему
Новые блоги и статьи
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru