Firebird CS 2.1.3.18185

g++ версии 4.4.3-4ubuntu5


Отладчиком пользоваться не пытался.

Проверил на простом примере. Получается следующее.

Вариант 1. Без new и delete.

#include <stdlib.h>
long TESTINSERT(long *theArg)
{
  long* aTestItem = (long*) malloc(sizeof(long));
  free(aTestItem);

  long aResult = 777;
  return(aResult);
}

Такая UDF успешно отрабатывает.


Вариант 2. Ошибка с new и delete.

long TESTINSERT(long *theArg)
{
  long* aTestItem = new long;
  delete aTestItem;

  long aResult = 778;
  return(aResult);
}

Ошибка Segmentation fault.


Вариант 3. Пытаюсь перегрузить операторы new и delete.

#include <cstddef>
#include <stdlib.h>

void* operator new(size_t sz)
{
  void* m = malloc(sz);
  return m;
}

void operator delete(void* m)
{
  free(m);
}

long TESTINSERT(long *theArg)
{
  long* aTestItem = new long;
  delete aTestItem;

  long aResult = 779;
  return(aResult);
}
Ошибка Segmentation fault.


Если функция TESTINSERT вызывается не как UDF, а из обычной программы
- все три варианта работают.

Если подключить тестовый вывод, то в третьем варианте видно следующее.

При вызове из обычной программы отрабатывают перегруженные операторы.
Все происходит, как предполагалось.

При вызове UDF перегруженные операторы игнорируются. Выполнение туда
не передается.
Оператор new (не перегруженный) проходит без ошибки.
На операторе delete UDF падает.


С уважением, Владимир.





Ответить