Я уже знаю ответ, просто удалите ваш ojdbc из вашей библиотеки!
Чтобы выделить на стеке, или объявить Ваш объект как локальную переменную значением, или можно на самом деле использовать alloca, чтобы получить указатель и затем использовать оперативный новый оператор:
void *p = alloca(sizeof(Whatever));
new (p) Whatever(constructorArguments);
Однако, в то время как использование alloca и оперативный новый гарантирует, что память освобождена по возврату, Вы бросаете автоматический вызов деструктора. Если Вы просто пытаетесь удостовериться, что память освобождена на выход от объема, рассмотреть использование std::auto_ptr<T>
или некоторый другой тип интеллектуального указателя.
Jeffrey Hantin довольно корректен, что можно использовать размещение, новое для создания его на стеке с alloca. Но, серьезно, почему?! Вместо этого просто сделайте:
class C { /* ... */ };
void func() {
C var;
C *ptr = &var;
// do whatever with ptr
}
У Вас теперь есть указатель на объект, выделенный на стеке. И, это будет правильно уничтожено, когда Ваша функция будет существовать.
Вы могли сделать:
Whatever* aWhatever = new ( alloca(sizeof(Whatever)) ) Whatever;
Вы могли использовать класс RAII, чтобы сделать разрушение, которое я предполагаю (РЕДАКТИРОВАНИЕ: Также см. этот другой ответ для получения дополнительной информации о потенциальных проблемах с этим подходом):
template <class TYPE>
class RAII
{
public:
explicit RAII( TYPE* p ) : ptr(p) {}
~RAII() { ptr->~TYPE(); }
TYPE& operator*() const { return *ptr; }
private:
TYPE* ptr;
}
void example()
{
RAII<Whatever> ptr = new ( alloca(sizeof(Whatever)) ) Whatever;
}
Вы могли использовать макрос для сокрытия alloca.
Отношения DaveF
Будьте осторожны при использовании _alloca ()
с GCC
GCC имеет ошибку , которая делает _alloca ()
несовместимым с исключением SJLJ. обработка в C ++ (сообщается, что Dwarf2 работает правильно). Когда исключение выбрасывается из функции, выделяющей память, ошибка вызывает повреждение стека до того, как деструкторы запускаются. Это означает, что любой класс RAII, работающий с выделенными объектами, должен запускаться в другой функции для правильной работы. Правильный способ сделать это выглядит так:
void AllocateAndDoSomething()
{
Foo* pFoo = reinterpret_cast<Foo*>(_alloca(sizeof(Foo)));
new (pFoo) Foo;
// WARNING: This will not work correctly!
// ScopedDestructor autoDestroy(pFoo);
// pFoo->DoSomething();
// Instead, do like this:
DoSomething(pFoo);
}
void DoSomething(Foo* pFoo)
{
// Here, destruction will take place in a different call frame, where problems
// with _alloca() automatic management do not occur.
ScopedDestructor autoDestroy(pFoo);
pFoo->DoSomething();
}