Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.71/7: Рейтинг темы: голосов - 7, средняя оценка - 4.71
mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
Завершенные тесты: 3
1

Debug heap assert

21.12.2017, 22:24. Просмотров 1263. Ответов 11
Метки нет (Все метки)

Доброго времени суток. Столкнулся с ошибкой c таким описанием: __acrt_first_block == header

Вот код:

DLL проект:
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
struct splited_block {
   size_t id;
   uint8_t* data;
   size_t length;
 
   explicit splited_block(const size_t id, const size_t length)
      : id(id),
        length(length)
   {
      data = new uint8_t[length];
   }
 
   //~splited_ip_block() { delete[] data; } 
   // вот если закоментить деструктор, то вылетает ассерт, описанный выше.
   // если раскомментировать, то отладка просто падает в деструкторе без ассертов
 
   friend bool operator<(const splited_ip_block& lhs, const splited_ip_block& rhs) { return lhs.low_cnt < rhs.low_cnt; }
};
 
class Wall{
   std::set<splited_block>storage;
public:
   __declspec(dllexport) void save(const uint8_t* data, const size_t length, const size_t id);
};
 
void Wall::save(const uint8_t* data, const size_t length, const size_t low_cnt)
{
   const auto& it = storage.insert(splited_ip_block{ low_cnt, length - 0 });
   memcpy(it.first->data, data, length - 0);
}

тестовый консольный проект
Кликните здесь для просмотра всего текста
C++
1
2
3
Wall wall;
uint8_t test_data[] = { 0x0a, 0x0b, 0x0c,0x0d };
umts.parse(test_data, 4, 216);


Подскажите, что я делаю не так?

Добавлено через 40 минут
Хмм... если std::set заменить на std::vector, то все нормально. Проблема с insert или it?
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2017, 22:24
Ответы с готовыми решениями:

Как исправить Debug Assert Failed в коде работы с матрицей?
Здравствуйте, мне нужно сделать такое задание: Написать функцию для произвольного двухмерного...

Debug Error HEAP CORRUPTION DETECTED
После ввода всех значений появляется окно с надписью Debug error! HEAP CORRUPTION DETECTED и так...

assert.h
Как понять часть после &quot;||&quot;? Оно выводит на экран, или куда то еще записывает ? assert(value == 0...

Assert
Помогите пожалуйста написать функцию ассерт в файле... не знаю как((( объяяяясните..вопрос жизни и...

Деректива assert
Как правильно? #include &lt;iostream&gt; #include &lt;assert.h&gt; #define NDEBUG assert(n == 0); int...

11
nmcf
6534 / 5758 / 2621
Регистрация: 14.04.2014
Сообщений: 24,494
21.12.2017, 22:25 2
Лучший ответ Сообщение было отмечено mat_for_c как решение

Решение

Надо полноценную реализацию делать с конструктором копирования и прочим.
Избавься от указателя. Используй vector.
1
mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
Завершенные тесты: 3
21.12.2017, 22:28  [ТС] 3
Цитата Сообщение от nmcf Посмотреть сообщение
Используй vector.
я хочу set
0
nmcf
6534 / 5758 / 2621
Регистрация: 14.04.2014
Сообщений: 24,494
21.12.2017, 22:28 4
Я про data.
0
21.12.2017, 22:28
mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
Завершенные тесты: 3
21.12.2017, 22:29  [ТС] 5
аа, это в структкре
0
mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
Завершенные тесты: 3
12.01.2018, 12:46  [ТС] 6
Вернусь снова к данной теме, ибо ошибка не пропала. Даже в самом простом примере:
dll проект
C++
1
2
3
4
5
6
7
8
9
10
11
12
// Exampl.h
class Example{
   std::vector<int> data;
   __declspec(dllexport) void foo();
 
// __declspec(dllexport) void foo() { data.push_back(10); }
// а при реализации тела метода в классе все ок.
}
 
// Example.cpp
void Example::foo() { data.push_back(10); } 
// при таком случае выдает assert при завершении программы
тестовый проект
C++
1
2
3
4
int main() {
   Example ex;
   ex.foo();
}
Кто-нибудь знает, в чем причина?
0
Selot
189 / 125 / 52
Регистрация: 19.01.2010
Сообщений: 511
Завершенные тесты: 2
12.01.2018, 12:58 7
длл и проект одним компилем собраны?
0
Mournful Max
Велосипедист...
349 / 216 / 73
Регистрация: 15.12.2015
Сообщений: 785
Завершенные тесты: 1
12.01.2018, 12:59 8
Ну, как минимум, foo вызывать нельзя извне класса...)
0
mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
Завершенные тесты: 3
12.01.2018, 13:04  [ТС] 9
Цитата Сообщение от Selot Посмотреть сообщение
длл и проект одним компилем собраны?
да
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Ну, как минимум, foo вызывать нельзя извне класса...)
пордон, public: забыл написать тут
0
Mournful Max
Велосипедист...
349 / 216 / 73
Регистрация: 15.12.2015
Сообщений: 785
Завершенные тесты: 1
12.01.2018, 13:06 10
Вообще, может быть, скорее всего, я «не шарю», но здесь вот структура называется:
Цитата Сообщение от mat_for_c Посмотреть сообщение
C++
1
struct splited_block
А деструктор для какого-то splited_ip_block:
Цитата Сообщение от mat_for_c Посмотреть сообщение
C++
13
//~splited_ip_block() { delete[] data; }
Тут тоже непонятно:
Цитата Сообщение от mat_for_c Посмотреть сообщение
C++
17
friend bool operator<(const splited_ip_block& lhs, const splited_ip_block& rhs) { return lhs.low_cnt < rhs.low_cnt; }
Цитата Сообщение от mat_for_c Посмотреть сообщение
C++
28
const auto& it = storage.insert(splited_ip_block{ low_cnt, length - 0 });
0
mat_for_c
223 / 213 / 80
Регистрация: 26.04.2013
Сообщений: 971
Завершенные тесты: 3
12.01.2018, 13:10  [ТС] 11
Цитата Сообщение от Captain Maxee Посмотреть сообщение
Тут тоже непонятно:
Туда можно не смотреть Хочу разобраться с классом Example - он меньше и без опечаток (кроме public) в названиях
0
Selot
189 / 125 / 52
Регистрация: 19.01.2010
Сообщений: 511
Завершенные тесты: 2
12.01.2018, 13:18 12
Тема с передачей класса из длл такая себе, прострел ног обеспечен, как и при передаче нетривиальных типов через границу "приложение-библиотека". Попробуйте обычные функции в длл использовать, котрые будут дергать уже методы класса. И создание/удаление объекта также через функции (фабрика). Типа:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// dll
 
// class declaration
class SomeClass
{
public:
  void foo();
};
 
extern "C"
{
  void create_instance(SomeClass* obj) { obj = new SomeClass(); }  
  void free_instance(SomeClass* obj) { delete obj; } 
 
  void wrap_foo(SomeClass* obj) { obj->foo(); }
  //...
}
C++
1
2
3
4
5
6
7
8
9
10
//proj
#include "SomeClass.h"
int main()
{
  SomeClass* obj;
  create_instance(obj);
  wrap_foo(obj);
  free_instance(obj);
 
}
1
12.01.2018, 13:18
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.01.2018, 13:18

Макрос ASSERT
Взял готовый пример из учебника, код работает, но может кто-нибудь пояснить для чего используется...

Не могу отключить assert()
Я использую функцию assert() ,на cpprefernce написано : This macro is disabled if, at the moment...

Assert и запятые в шаблонах
Как запихать в assert шаблон с двумя аргументами? Чего-то не компилируется. template&lt;typename...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.