Только для записи, обнуление битов в объекте не повлияет на то, будет ли вызван деструктор (если только у компилятора нет особой причуды, которая допускает такое поведение). Просто напишите несколько операторов логирования в деструкторе, чтобы проверить это.
Структурирование вашей программы, чтобы ничего не распределять, вероятно, так, как была спроектирована система. Раньше я не работал со встроенными системами, однако я читал некоторые опытные магазины встроенных систем, которые не рекомендуют использовать динамическую память, потому что среда выполнения имеет ограниченные возможности.
Однако, если необходимо, вы все равно можете использовать новое место размещения. Если у вас нет заголовка <new>
, вот соответствующие строки прямо из него в моей версии GCC:
// Default placement versions of operator new.
inline void* operator new(std::size_t, void* __p) throw() { return __p; }
inline void* operator new[](std::size_t, void* __p) throw() { return __p; }
// Default placement versions of operator delete.
inline void operator delete (void*, void*) throw() { }
inline void operator delete[](void*, void*) throw() { }
Вставьте это где-нибудь в заголовочный файл, включенный в каждый исходный файл, который использует размещение new / delete.
Пример файла, который проверяет это:
#include <cstdio>
#include <new>
int
main(int argc, char** argv)
{
typedef char const* cstr;
char foobar[16];
cstr* str = new (&foobar) cstr(argc > 1 ? argv[1] : "Hello, world!");
std::puts(*str);
str->~cstr();
}
В моей версии GCC здесь вообще не используется libstdc++
(если используется -fno-exceptions
).
Теперь, если вы хотите объединить это с malloc
(если ваша платформа обеспечивает это), то вы можете сделать это:
#include <cstdio>
#include <cstdlib>
inline void* operator new (std::size_t n) {return std::malloc(n);}
inline void* operator new[](std::size_t n) {return std::malloc(n);}
inline void operator delete (void* p) {std::free(p);}
inline void operator delete[](void* p) {std::free(p);}
int
main(int argc, char** argv)
{
typedef char const* cstr;
cstr* str = new cstr(argc > 1 ? argv[1] : "Hello, world!");
std::puts(*str);
delete str;
}
Это позволяет вам использовать стандартный new
/ delete
, с которым вы знакомы, без необходимости использования libstdc++
.
Удачи!