новый на стеке вместо "кучи" (как alloca по сравнению с malloc)

Я уже знаю ответ, просто удалите ваш ojdbc из вашей библиотеки!

15
задан Yu Hao 14 August 2013 в 06:43
поделиться

4 ответа

Чтобы выделить на стеке, или объявить Ваш объект как локальную переменную значением, или можно на самом деле использовать alloca, чтобы получить указатель и затем использовать оперативный новый оператор:

void *p = alloca(sizeof(Whatever));
new (p) Whatever(constructorArguments);

Однако, в то время как использование alloca и оперативный новый гарантирует, что память освобождена по возврату, Вы бросаете автоматический вызов деструктора. Если Вы просто пытаетесь удостовериться, что память освобождена на выход от объема, рассмотреть использование std::auto_ptr<T> или некоторый другой тип интеллектуального указателя.

23
ответ дан 1 December 2019 в 00:50
поделиться

Jeffrey Hantin довольно корректен, что можно использовать размещение, новое для создания его на стеке с alloca. Но, серьезно, почему?! Вместо этого просто сделайте:

class C { /* ... */ };

void func() {
    C var;
    C *ptr = &var;

    // do whatever with ptr
}

У Вас теперь есть указатель на объект, выделенный на стеке. И, это будет правильно уничтожено, когда Ваша функция будет существовать.

12
ответ дан 1 December 2019 в 00:50
поделиться

Вы могли сделать:

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

5
ответ дан 1 December 2019 в 00:50
поделиться

Будьте осторожны при использовании _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();
}
2
ответ дан 1 December 2019 в 00:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: