Size: a a a

2020 April 15

m

monagatep in pro.cxx
Причём, если в блоке try до исключения сделать return true, то работает
источник

m

monagatep in pro.cxx
Да.
источник

m

monagatep in pro.cxx
Пробовал throw 123, чтобы не было выделений памяти, пробовал всё переместить в другую функцию (чтобы не было `extern "C" и т.д -- всё равно падает
источник

ПК

Побитый Кирпич in pro.cxx
monagatep
Подскажите, а как в компиляторе Visual Studio заюзать исключения в DLL?

Вот есть такой код:

```
extern "C" __declspec(dllexport) bool __stdcall
myFunc()
{
 try {
   throw std::runtime_error("check");
   return true;
 } catch(...) {
   return false;
 }
}
```

Дальше я использую её как плагин в MetaTrader, но при её вызове MetaTrader просто падает.
Хотя я ожидаю, что он не упадёт, а функция вернёт результат false.

В чём может быть дело?
> исключения в DLL

Никак в общем случае
источник

ПК

Побитый Кирпич in pro.cxx
extern "C" вообще не должен кидать исключения
источник

m

monagatep in pro.cxx
А в чём может быть проблема? Я ожидаю, что все эти исключения отловятся внутри функции
источник

m

monagatep in pro.cxx
Так оно внутри и задерживается, у меня ж там try {} catch (...) {}
источник

ПК

Побитый Кирпич in pro.cxx
monagatep
А в чём может быть проблема? Я ожидаю, что все эти исключения отловятся внутри функции
Если рантаймы у DLL и EXE разные, то исключения нельзя передавать между ними
источник

m

monagatep in pro.cxx
Они и не передаются
источник

m

monagatep in pro.cxx
Они внутри задерживаются, в catch(...) {}
источник

A

Alex in pro.cxx
Побитый Кирпич
extern "C" вообще не должен кидать исключения
он и не кидает, в примере исключение ловится внутри функции
источник

ПК

Побитый Кирпич in pro.cxx
monagatep
Они и не передаются
Да, вижу, сори
источник

ПК

Побитый Кирпич in pro.cxx
Это уже странно
источник

ПК

Побитый Кирпич in pro.cxx
Alex
кто-то знает, какой юнит физического выделения памяти у С++ кучи (heap) в msvc? С каким параметром malloc внутри своей реализации вызывает VirtualAlloc()?
Можно в исходниках посмотреть
источник

ПК

Побитый Кирпич in pro.cxx
Хотя я с наскоку не нашёл где malloc определён
источник

IA

Igor Akhmetov in pro.cxx
Alex
кто-то знает, какой юнит физического выделения памяти у С++ кучи (heap) в msvc? С каким параметром malloc внутри своей реализации вызывает VirtualAlloc()?
malloc зовет более высокоуровневую функцию  https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/ntifs/nf-ntifs-rtlallocateheap
источник

A

Alex in pro.cxx
интересно, спасибо, не знал
источник

A

Alex in pro.cxx
а в чём смысл существования этого API по сравнению с VirtualAlloc?
источник

YH

Yuri Hudobin in pro.cxx
Alex
а в чём смысл существования этого API по сравнению с VirtualAlloc?
VirtualAlloc для shared memory видимо.
источник

AM

Aleksey Muravev in pro.cxx
Alex
а в чём смысл существования этого API по сравнению с VirtualAlloc?
VirtualAlloc
A low-level, Windows API that provides lots of options, but is mainly useful for people in fairly specific situations. Can only allocate memory in (edit: not 4KB) larger chunks. There are situations where you need it, but you'll know when you're in one of these situations. One of the most common is if you have to share memory directly with another process. Don't use it for general-purpose memory allocation. Use VirtualFree to deallocate.

HeapAlloc
Allocates whatever size of memory you ask for, not in big chunks than VirtualAlloc. HeapAlloc knows when it needs to call VirtualAlloc and does so for you automatically. Like malloc, but is Windows-only, and provides a couple more options. Suitable for allocating general chunks of memory. Some Windows APIs may require that you use this to allocate memory that you pass to them, or use its companion HeapFree to free memory that they return to you.
источник